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;
}