刷題記錄 CF每日一題打卡 2020.6月7-6月13

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章