Codeforces Round #855 (Div. 3) A-E
创始人
2024-05-28 14:05:59

传送门

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;//meowcin>>s;bool st1=0,st2=0,st3=0,st4=0,st5=0;for(int i =0;iif(s[i]>='a')s[i]-=('a'-'A');}string a;for(int i=0;iif(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;mapq;for(int i =0;iint l=i-('a'-'A');if(q[i]res+=min((q[i]-q[l])/2,k);k-=min((q[i]-q[l])/2,k);}}	cout<

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 ,less >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<

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;iif(a[i]==a[i+2]&&i+2

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 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(nswap(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.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...