刷题记录 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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值