Codeforces Round #620 div 2 A~D題解

比賽鏈接

A

題意:兩隻兔子面對面跳,一隻一次跳a,另一隻一次跳b問是否可能同時到達一個點
題解:判斷兩人之間的距離能否整除a+b即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int x,y,a,b;
		scanf("%d%d%d%d",&x,&y,&a,&b);
		if(abs(x-y)%(a+b)==0)printf("%d\n",abs(x-y)/(a+b));
		else puts("-1");
	} 
	return 0;
}

B

題意:給出n個長度爲m的字符串,可以重新串聯其中任意字符串,問能串出來的最長迴文串是什麼
題解:如果一個串本身是迴文串,那麼他就是我們新串的中間元素,那麼只需要check對於一個字符串,他的相反串在不在給出的n個串中即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int n,m,cnt=1,vis[110];
string s[110],ans[110];
map<string,int>mp;
bool check(string s){
	int len=s.length(); 
	for(int i=0;i<len;i++)
		if(s[i]==s[len-1-i])continue;
		else return false;
	return true;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		cin>>s[i] ;
		mp[s[i]]=i;
	} 
	for(int i=1;i<=n;i++){
		if(check(s[i])){
			ans[50]=s[i];
		}else{
			string a=s[i];
			reverse(a.begin(),a.end());
			if(mp.count(a) && !vis[mp[a]]){
				ans[cnt]=s[i];
				ans[100-cnt+1]=a;
				cnt++;
				vis[mp[a]]=1;
				vis[i]=1;
			}
		}
	}
	int sum=0;
	string anss;
	for(int i=1;i<=100;i++)
		if(ans[i][0]!='\0')sum+=m,anss=anss+ans[i];
	printf("%d\n",sum);
	cout<<anss<<endl;
	return 0;
}

C

題意:有一臺空調,一分鐘能制熱一攝氏度或製冷一攝氏度或使溫度不變。每個ti時刻會進來一個人,他的舒適溫度是[li,ri][l_i,r_i],問能否使所有顧客舒適。
題解:維護一個區間[L,R][L,R],每次進一個客人,他的可到達區間就是[L(titi1,R+(titi1)][L-(t_i-t_{i-1},R+(t_i-t_{i-1})],判斷這個區間和客人的舒適溫度區間是否一直相交即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int n,m;
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int flag=0;
		scanf("%d%d",&n,&m);
		int l=m,r=m,la=0;
		for(int i=1;i<=n;i++){
			int t,le,ri;
			scanf("%d%d%d",&t,&le,&ri);
			l=l-(t-la),r=r+(t-la);
			if(l>ri)flag=1;
			if(r<le)flag=1;
			l=max(l,le);r=min(r,ri);la=t;
		}
		if(flag)puts("NO");
		else puts("YES");
	}
	return 0;
}

D

題意:給出n個數和n-1個大小關係,問能否構造出最少的LIS和最多的LIS(LIS 最長上升子序列)
題解:貪心,對於最少的LIS就是原數組儘量將大的數字放在前面。對於最多的LIS就是儘量將最小的數字放在前面

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int n,a[maxn];
char s[maxn];
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%s",&n,s+1);
		for(int i=1;i<=n;i++)a[i]=n-i+1;
		for(int i=1;i<n;){
			int j=i;
			while(s[j]=='<')j++;
			reverse(a+i,a+j+1);
			i=j+1;
		}
		for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
		for(int i=1;i<=n;i++)a[i]=i;
		for(int i=1;i<n;){
			int j=i;
			while(s[j]=='>')j++;
			reverse(a+i,a+j+1);
			i=j+1;
		}
		for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);	
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章