Acwing 第117场周赛

发布时间 2023-08-20 11:58:46作者: du463

Acwing 第117场周赛

这次的题比较简单,但是在做第二题的时候有地方一开始没有想到,导致想的比较简单,提交错了两次,下次要彻底思考清楚再提交

A题

题意:

给定一个正整数 n,请你计算一共有多少个正整数数对 (a,b)同时满足:
a>b
a+b=n
输入格式
第一行包含整数 T,表示共有 T组测试数据。
每组数据占一行,包含一个正整数 n。

输出格式
每组数据输出一行结果,一个整数,表示满足条件的数对数量。
数据范围前 3个测试点满足 1≤T≤10。
所有测试点满足 1≤T≤104,1≤n≤2×109。

思路:

根据题意不难看出,我们要求的正整数数对的个数其实就是(n-1)/2个

代码:

#include<bits/stdc++.h>
using namespace std;
// const int N=1e5+10;
void solve(){
	int n;
	cin>>n;
	cout<<(n-1)/2<<endl;
	

}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;

}

B题

题意:

某款冒险游戏需要玩家通过 n个关卡获得最终胜利。
第一关为准备关卡,不会经历任何事件。
后续 n−1关,每一关都需要玩家依次经历以下两种事件:首先,玩家会获得一个免伤道具。游戏中一共包含 26种不同类型的免伤道具,用小写字母 a∼z来表示。然后,玩家会受到一次伤害。游戏中一共包含 26种不同类型的伤害,用大写字母 A∼Z来表示。免伤道具与伤害一一对应,道具 a对应伤害 A,道具 b对应伤害 B,以此类推。
当玩家受到某种伤害时,如果自身持有至少一个该伤害的对应免伤道具,则消耗一个对应免伤道具,并免除此次伤害,否则将受到一次伤害。
注意,当前关卡获得的道具即使当前关卡用不到,也可以留着以后关卡使用。
请你计算,整个游戏过程中玩家一共会受到多少次伤害。

思路:

这其实就是一个模拟题,我们只需要统计每关26种免疫道具的数量即可,注意有可能某一种道具不止有一个,可能有多个,因为可以留在后面的关卡,这里也是我一开始错误的点,我只记录了一个。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[30];

void solve(){
	int n;
	cin>>n;
	memset(a,0,sizeof a);

	int ans=0;
	for(int i=1;i<=2*n-2;i++){
		char a1;
		cin>>a1;
		if(a1>='a'&&a1<='z'){
			int b=a1-'a';
			a[b]++;

		}
		else{
			int b=a1-'A';
			if(!a[b]){
				ans++;
			}
			else{
				a[b]-=1;
			}
		}
	}
	cout<<ans<<endl;
}
int main(){
	int t;
	// cin>>t;
	t=1;

	while(t--){
		solve();
	}
	return 0;
}

C题

题意:

贝茜(Bessie)作为约翰农场资历最老的牛,它拥有一个大家族,具体来说它一共有 n
个后代。
它的家族关系可以看作一个树形结构,它作为奶牛老祖视为树的根节点,即它没有父节点。现在,给定家谱树中其它牛的父节点信息,请你计算树中深度最大的节点的深度。
根节点的深度为 1。
注意:
树中每个节点都由节点对应的奶牛的名字表示。
每头奶牛都有一个独一无二的名字,名字中只包含大小写字母和数字。
名字中的字母不区分大小写,也就是说如果输入中出现了两个仅字母大小写不同的名字,那么它们对应的是同一头牛(同一节点)。
贝茜的名字就是 Bessie,当然在输入中名字中的字母不区分大小写。
输入保证,对于任何一对奶牛父子 ai,bi,在你得知奶牛 ai的父亲是奶牛 bi之前,你一定已经获知了奶牛 bi的父亲信息。
贝茜的父亲信息是无,因为它是根节点,这一点是你一开始就获知的。
输入格式
第一行包含整数 n,表示贝茜的后代数量。
接下来 n行,每行包含两个由大小写字母和数字构成的字符串 ai,bi,表示奶牛 ai的父亲是奶牛 bi。
提示:注意题目中提到过的输入顺序的特殊性。
输出格式
一个整数,表示树中深度最大的节点的深度。
数据范围
前 3个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤200,每个姓名字符串的长度取值范围为 [2,24]。

思路:

其实就是一个哈希表的简单应用,注意题中说名字不区分大小写,那么我们为了统一可以将所有名字转为大写或者小写。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[30];
unordered_map<string, int> mp; // 将每头牛的名字映射到相对应的深度
string xiao(string s){
	for(int i=0;i<s.size();i++){
		s[i]=tolower(s[i]);
	}
	return s;
}
void solve(){
	
	mp["bessie"]=1;
	//确定根节点
	int n;
	cin>>n;
	int cnt=0;

	while(n--){
		string a,b;
		cin>>a>>b;
		a=xiao(a);
		b=xiao(b);
		mp[a]=mp[b]+1;
		cnt=max(cnt,mp[a]);

	}
	cout<<cnt<<endl;

}
int main(){
	int t;
	// cin>>t;
	t=1;

	while(t--){
		solve();
	}
	return 0;

}