codeforces round #704题解

codeforces round #704题解

A. three swimmers
题目大意:有三个人游泳,他们到达岸边的时间分别是a,b,c的倍数,同时,你会在第p秒到达岸边,请问你到达岸边后最少过多长时间会遇到某个游泳的人?
解析:分两种情况,如果q可以被a,b,c整除,结果是0,如果不能整除,计算边界情况,语言无法表达。。。。。看代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		long long int p,a[3];
		cin>>p>>a[0]>>a[1]>>a[2];
		long long int ans=1e18;
		for( int i=0;i<3;i++){
			long long  int temp=p/a[i]*a[i];
			if(p%a[i]==0){
				ans=0;
				break;
			}
			else{
				ans=min(temp+a[i]-p,ans);
			}
		}
		cout<<ans<<endl;
	}
}

B. Card Deck
题目大意:
解析:
贪心算法

#include<bits/stdc++.h>
using namespace std;
int a[100100];
int pos[100100];//储存数字的位置 
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			pos[a[i]]=i;
		} 
		int p=n+1;
		for( int i=n;i>=1;i--){
			if(pos[i]<p){
				for( int j=pos[i];j<p;j++){
					cout<<a[j]<<" ";
				}
				p=pos[i];
			}
		}
	}
}

C. Maximum width
题目大意:
现在有两个字符串,第一个字符串包含第二个字符串中的全部字符,求两个相邻字符之间的最大距离
解析:贪心算法,从正向和负向分别进行匹配,然后找差的最大值

#include<bits/stdc++.h>
using namespace std;
string a,b;
int pos1[200010];
int pos2[200010];
int main(){
	int la,lb;
	cin>>la>>lb;
	cin>>a>>b;
	int j=0;
	for( int i=0;i<la;i++){
		if(a[i]==b[j]){
			pos1[j]=i;
			j++;
		}
		if(j>=lb) break;
	}
	j=lb-1;
	for( int i=la-1;i>=0;i--){
		if(a[i]==b[j]){
			pos2[j]=i;
			j--;
		}
		if(j==-1) break;
	}
	int ans=0;
	for( int i=0;i<lb-1;i++){
		ans=max(ans,pos2[i+1]-pos1[i]);
	}
	cout<<ans<<endl;
}

D. Genius‘s Gambit
题目大意:
给定三个数a,b和k,要求找到两个数x和y,这两个数的二进制形式都包含a个0和b个1;如果将两个数相减,则x-y=z的二进制数含有k个1。请问是否存在这样的x和y?
题目解析:
先假设b=2的情况,然后在这个情况的基础上把0改为1;注意讨论特殊情况

#include<bits/stdc++.h>
using namespace std;
int rem[200100];
int main(){
	int a,b,k;
	cin>>a>>b>>k;//a is the number of zeros ;b is the number of ones
	//最多凑出a+b-2个1 
	if(k>a+b-2&&k!=0){
		cout<<"No"<<endl;
		return 0; 
	}
	if(b==1&&k!=0||a==0&&k!=0) {
		cout<<"No"<<endl;
		return 0;
	}
	if(k==0){
		cout<<"yes"<<endl;
		for( int i=1;i<=b;i++) cout<<1;
		for( int i=1;i<=a;i++) cout<<0;
		cout<<endl;
		for( int i=1;i<=b;i++) cout<<1;
		for( int i=1;i<=a;i++) cout<<0;
		cout<<endl;
		return 0;
	}
	else {
		cout<<"Yes"<<endl;
		cout<<11;
		int temp=b-2;
		for( int i=1;i<=k-1;i++){
			if(temp>0) {
				cout<<1;
				temp--;
			}
			else cout<<0;
		}
		cout<<0;
		for( int i=1;i<=a+b-k-2;i++){
			if(temp>0){
				cout<<1;
				temp--;
			}
			else cout<<0;
			
		}
		cout<<endl;
		cout<<10;
		temp=b-2;
		for( int i=1;i<=k-1;i++){
			if(temp>0){
				cout<<1;
				temp--;
			}
			else cout<<0;
		}
		cout<<1;
		for( int i=1;i<=a+b-k-2;i++){
			if(temp>0){
				cout<<1;
				temp--;
			}
			else cout<<0;
		}
		cout<<endl;
	}
}

E.Almost Fault-Tolerant Database

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值