Codeforces Round#652(Div.2)ABCD問題解

21996 ワード

A. FashionabLee


転送ドアの題意:n多角形にx軸とy軸に平行なエッジが同時にあるかどうかを判断する.4*k=nの多角形はすべて満足して、残りはすべて満足しません;
#include
#include
#include
using namespace std;
int main()
{
	int t,n;
	cin>>t;
	while(t--){
		cin>>n;
		if(n%4==0) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

B. AccurateLee


転送ゲートの問題:2進数の文字列で、10のサブストリングのいずれかを削除して、最後に残った文字の個数を最小限に抑えることができます.最小(2つの文字列xとyが同じ長さである場合xは辞書でyよりも職位iがあれば.x 1=y 1,x 2=y 2,...,xi−1=yi−1とxi問題解:問題から文字列の先頭の0が削除できず,文字列の末尾の1が削除できず,中間の1が前の0が後にある場合,残りの1つをすべて削除することができるが,最小であるため,残りは必ず0である.だからそれぞれ後から0に遍歴して停止することができる下に降りて、また前から1に出会って止まって最後に得た結果を答えの逆順にします.
#include
#include
#include
using namespace std;
string s;
int main()
{
	int t,n;
	cin>>t;
	while(t--){
		cin>>n>>s;
		int p=1;
		string ans;
		for(int i=s.size()-1;i>=0;i--)
		if(s[i]=='0'){	ans+="0";
		p=i;
		break;	} 
		// 0 
		else if(s[i]=='1') ans+="1";
		for(int i=0;i<p;i++)
		if(s[i]=='0') ans+="0";
		else break;
		// 1 
		for(int i=ans.size()-1;i>=0;i--) cout<<ans[i];
		// 
		cout<<endl;
	}
	return 0;
}

C.Rational Lee


転送ドアの題意:n個の整数があって、k個人、一人一人がいくつかの整数を得る必要があるのはすでに確定して、今n個の整数を要求に従ってすべてk個人に分けて、それからk個人の総幸福値(一人一人が得た最大整数と最小整数の和は彼の幸福値)を計算します:まずk個の最大値をk個の要求に従って大きいから小さいまでk個の需要個数の人の手に割り当てます;そして残りの整数を同じ方法で一人一人に割り当てるといいです
#include
#include
#include
using namespace std;
const int N=200010;
int t,n,k;
int a[N],w[N],s[N];
long long int sum=0;
int main()
{
	scanf("%d",&t);
	while(t--){
		memset(s,0,sizeof s);
		sum=0;
		scanf("%d%d",&n,&k);
		for(int i=0;i<n;i++) scanf("%d",&a[i]);
		for(int i=0;i<k;i++) {
			scanf("%d",&w[i]);
			w[i]--;
			// , 1
		}
		sort(a,a+n);// 
		sort(w,w+k);// k 
		int z=0,i=n-1;
	for(i;i>=0;i--) if(z<k) s[z++]=a[i];
	// 
	i=n-z-1;// 
	for(int j=0;j<k;j++) {
		if(w[j]==0) s[j]+=s[j];
		// 0 
	  else {
	   	i=i-w[j];
	   	s[j]+=a[i+1];
		}
		// w[j] , 
	}
		for(int i=0;i<k;i++)  sum+=s[i];
		// 
		cout<<sum<<endl;
	}
	return 0;
}

D.TediousLee


転送ゲートは規則を探して、コードをつけます
#include
using namespace std;
#define N 2000005
#define ll long long
#define mod 1000000007
int i,T,n,x;ll ans[N];
int main(){
	cin>>T;
	ans[3]=ans[4]=4;
	for(i=5;i<N;++i){
		ans[i]=ans[i-1]+ans[i-2]*2+(i%3==0)*4;ans[i]%=mod;
	}
	while(T--){
		cin>>x;cout<<ans[x]<<"
"
; } }