Codeforces Round #855 (Div. 3) A-E

传送门

A. Is It a Cat?

题意

给你一个只有英文字母的字符串,问你这个字符串是否由连续的’m’, ‘e’, ‘o’,‘w’,(顺序不能改变)构成,并且不区分大小写。
如: “meow”, “mmmEeOWww”, “MeOooOw” 是符合要求的, 但是 “Mweo”, “MeO”, “moew”, “MmEW”, "meowmeow"是不符合的

思路

对于不同的字符串直接加入到新字符串中,然后和“MEOW”对比是否一致即可,记得大小写一致。

代码

void slove( )
{
	int t;
	cin>>n;
	string s;//meow
	cin>>s;
	bool st1=0,st2=0,st3=0,st4=0,st5=0;
	for(int i =0;i<n;i++)
	{
		if(s[i]>='a')s[i]-=('a'-'A');
	}
	string a;
	for(int i=0;i<n;i++)
	{
		if(s[i]!=s[i+1])a+=s[i];
	}	
	if(a=="MEOW")cout<<"YES\n";
	else cout<<"NO\n";

B. Count the Number of Pairs

题意

给你一个只有英文字母的字符串s,如果两个满足字符满足大小写关系,那么就说明他们是配对的。每对成功配对后的字符不可重复配对。给你一个k,你可以对任意字符进行大小写交换操作(最多k次),问你这个字符串最多有多少个配对。

思路

用map存储每一个字符出现的次数,然后先加上大小写共有的字符数量,然后再根据k的值进行操作即可。

代码

void slove( )
{
	int k;
	cin>>n>>k;
	string a;
	cin>>a;
	map<int,int>q;
	for(int i =0;i<n;i++)
	q[a[i]]++;
	
	int res=0;
	for(int i ='a';i<='z';i++)
	{
		int l=i-('a'-'A');
		if(q[i]<q[l])swap(q[i],q[l]);
		res+=q[l];
		if(k){
			res+=min((q[i]-q[l])/2,k);
			k-=min((q[i]-q[l])/2,k);
		}
	}	
	cout<<res;
	cout<<endl;
}

C2/c1. Powering the Hero (hard version)

题意

按顺序给你n张卡牌,这些卡牌分为两类:力量牌和角色牌。对于力量牌,你可以把它放在你的力量牌顶:对于角色牌(初始力量为0),你可以消耗最上方的力量牌排融入其中。问你他的所有角色的力量和的最大值是多少?

思路

对于每一张角色牌时,他能获得的最大力量值就是他前面的最大的一张力量排,那么可以直接用优先队列去对力量值进行排序然后取值即可。

 

void slove( )
{
	cin>>n;
	for(int i =1;i<=n;i++)
	cin>>stt[i];
	
	ll res=0,k=0;
	priority_queue <int,vector<int>,less<int> >q;
	for(int i =1;i<=n;i++)
	{
		if(stt[i]!=0)
		q.push(stt[i]);
		else if(q.size()) {
			res+=q.top();
			q.pop();
		}
	}
	cout<<res
	cout<<endl;
}

D. Remove Two Letters

题意

给你一个长度为n的小写字符串,问你任意去除两个相邻的字符串之后,不同的字符串的种类有多少

思路

一眼我是STL大神, 直接map存字符串结果荣获mle5
可以用字符串哈希,但是这道题明显有更简单的方法。首先
如果考虑最优情况,最多的不同的字符串种类肯定是n-1种,那么在此前提下我们去找相同的情况:

因为由样例“ababa”可以发现
如果s[i]==s[i+2],那么两次删除的字符串是相同的,那么直接遍历一遍如果存在就ans–,最后直接输出即可。

代码

void slove( )
{
	int t;
	cin>>n;
 
	cin>>a;
	int sum=n-1;
	for(int i =0;i<n;i++)
	{
		if(a[i]==a[i+2]&&i+2<n)sum--;
	}
	cout<<sum;
	cout<<endl;
}

E2/E1 Unforgivable Curse (hard version)

题意

给你两个长度为n的只有英文的字符串a,b,然后给你一个k,你可以使si和s(i+k)或者si和s(i+k+1)交换,问你能否通过任意次交换,使得a,b字符串相等。

思路

假设是长度为(k+1)的字符串,那么就只能对于s1和s(1+k)进行交换,那么此时看换之前和换之后如果满足条件,否则无论怎么都满足不了

那么如果是小于(k+1)长度的字符串呢:那么这种字符串就是完全不能交换,即如果开始能满足就是YES,不能为NO。

如果是大于(k+1)长度的,那么从k+1开始看起,当n=k+2时,能任意交换的数字有开头两个和结尾两个,长度每次加1,能任意交换的数字就+2(末尾和不能交换的数字的最左边)(
例:abcdef 和k为4,那么能够任意交换的字符为abef,如果n为abcdefg,那么能够任意交换的字符为abcefg),
那么可以取这部分范围内不可交换的字串判断一下如果相等也是可以交换的;直到n为2*k的时候,所有的字符都可以任意交换。

代码

void slove()
{
	int k;
	cin>>n>>k;
	string a, b;
	cin >> a >> b;

	map<int, int> p, q;
	for (int i = 0; i < n; i++)
		q[a[i]]++, p[b[i]]++;
 
	for (int i = 0; i < n; i++)
	{
		if (q[a[i]] != p[a[i]])
		{
			cout << "NO\n";
			return;
		}
	}
	if (a == b||k==1)
	{
		cout << "YES\n";
		return;
	}
 
		if(n<k+1)cout<<"NO\n";
		else if(n==k+1){
			swap(a[0],a[n-1]);
			if(a==b)cout<<"YES\n";
			else cout<<"NO\n";
		}
		else if(n>=2*k) cout<<"YES\n";
		else{
			a=a.substr(n-k,2*k-n);
			b=b.substr(n-k,2*k-n);
			if(a==b)cout<<"YES\n";
		else cout<<"NO\n";
		}
}

总结:感觉这一场打的还行,d题也没有特别的无脑wa(但是下次还可以少wa点),e的思路差不多都有了,但是写出d后没那么多想法了就有点水群,以后要记得全力以赴!!!

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值