1.CF1263D Secret Passwords
并查集,每个字符串跟它的首字母连边,最终输出联通块数量
#include<bits/stdc++.h>
using namespace std;
int t,n,m;
int vis[200005];
string a[200005];
int f[200005];
int find(int x){
if(x==f[x])return x;
return f[x]=find(f[x]);
}
void hb(int x,int y){
int fx=find(x);
int fy=find(y);
f[fy]=fx;
}
signed main(){
cin>>t;
for(int i=1;i<=t;i++){
cin>>a[i];
}
for(int i=1;i<=50;i++){
f[i]=i;
}
for(int i=1;i<=t;i++){
int len=a[i].length();
if(len==1)continue;
int x=a[i][0]-'a'+1;
for(int j=1;j<len;j++){
int y=a[i][j]-'a'+1;
if(find(x)!=find(y))hb(x,y);
}
}
int ans=0;
for(int i=1;i<=t;i++){
int x=a[i][0]-'a'+1;
int xx=find(x);
if(vis[xx]==0){
vis[xx]++;
ans++;
}
}
cout<<ans;
return 0;
}
2.CF1217B Zmei Gorynich
打可爱的小恐龙
记录一刀maxx 最大伤害和 hao 最大(伤害-回血)
总血量减去一刀最大除以 hao判断余数就ok了
#include<bits/stdc++.h>
using namespace std;
void shit();
int t,x,n,m;
int main(){
cin>>t;
while(t--){
cin>>n>>m;
int x,y;
int hao=0;
int maxx=0;
for(int i=1;i<=n;i++){
cin>>x>>y;
hao=max(hao,x-y);
maxx=max(x,maxx);
}
if(maxx>=m){
printf("1\n");
continue;
}
else{
if(hao<=0){
printf("-1\n");
}
else{
int tt=m-maxx;
int ans=0;
if(tt%hao==0){
ans+=tt/hao;
}
else{
ans+=(tt/hao)+1;
}
printf("%d\n",ans+1);
}
}
}
return 0;
}
3.CF1234C Pipes
1和2一样 3456一样
用二维string记录上面的管子和下面的管子
如果管子不是1or2就x=!x ,也就是换到另外一行,如果换行之后的管子是1or2就直接break,因为不可能能跟下一根连接,如果是3456就不需要管这一行了直接y++到下一次循环就ok
最终判断是否能到达1,n
#include<bits/stdc++.h>
using namespace std;
int q,n;
string a[2];
int main(){
cin>>q;
while(q--){
cin>>n;
cin>>a[0];
cin>>a[1];
int x=0,y=0;
for(int i=0;i<n;i++){
if(a[x][y]>'2'){
x=!x;
if(a[x][y]<='2')break;
}
y++;
}
if(x==1&&y==n)printf("YES\n");
else printf("NO\n");
}
return 0;
}
4.CF1209C Paint the Digits
把原字符串复制一份,对原串排序,遍历一遍,跟排序后原串相等就标记为1,pos后移
再遍历一遍,最终判断pos的是否等于n,不等于就输出-,等于就输出标记好的串
#include<bits/stdc++.h>
using namespace std;
string a,b,s;
int n,t;
int main(){
cin>>t;
while(t--){
cin>>n;
cin>>s;
a=s,b=s;
sort(s.begin(),s.end());
int id=0;
for(int i=0;i<n;i++){
if(s[id]==a[i]){
id++;
b[i]='1';
}
}
for(int i=0;i<n;i++){
if(s[id]==a[i]){
id++;
b[i]='2';
}
}
if(id!=n)b="-";
cout<<b<<endl;
}
return 0;
}
5.CF1201B Zero Array
一开始把这题想复杂了,其实只需要判断最大数是否小于sum/2并且sum为偶数就可以了
#include<bits/stdc++.h>
using namespace std;
#define int long long
void shit();
int n,x;
signed main(){
cin>>n;
int sum=0,s=0;
for(int i=1;i<=n;i++){
cin>>x;
s=max(s,x);
sum+=x;
}
if(sum%2==0&&s<=sum/2)printf("YES\n");
else printf("NO\n");
return 0;
}
6.CF1196C Robot Breakout
给出每个机器人的上下左右能不能走,开4个坐标记录最大x,y,最小x,y
如果最小的小于等于最大就随便输出一个坐标,否则不可
#include<bits/stdc++.h>
using namespace std;
string a,b,s;
int n,t;
int main(){
cin>>t;
while(t--){
int mx=1e5,my=1e5;
int minx=-1e5,miny=-1e5;
cin>>n;
int x,y;
int f1,f2,f3,f4;
for(int i=1;i<=n;i++){
cin>>x>>y;
cin>>f1>>f2>>f3>>f4;
if(!f1)minx=max(minx,x);
if(!f2)my=min(my,y);
if(!f3)mx=min(mx,x);
if(!f4)miny=max(miny,y);
}
if(minx<=mx&&miny<=my)printf("1 %d %d\n",minx,miny);
else printf("0\n");
}
return 0;
}
7.CF1084C The Fair Nut and String
思路是递推算贡献,如果当前为a就ans+=now+1,为b的话就now=ans,now是记录截止到当前像aaabaaab这样的串的长度,其实就是相当于每个b两边a的数量相乘,最后不要忘了当前为a时自己有一个单独的贡献
#include<bits/stdc++.h>
using namespace std;
string s;
long long ans;
const int mod=1e9+7;
int main(){
cin>>s;
int now=0;
for(int i=0;i<s.length();i++){
if(s[i]=='a')ans=(ans+now+1)%mod;
else if(s[i]=='b')now=ans%mod;
}
cout<<ans;
return 0;
}