Codeforces Round #662 (Div. 2)补题

A. Rainbow Dash, Fluttershy and Chess Coloring

画图,找规律发现结果为n/2+1

#include
#include
#include
#include 
#include 
#include  
#include 
#include 
#include 
#include
#include 
#define M 100
#define ll long long 
using namespace std;
int main(){
 
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
	
		printf("%d\n",n/2+1);
	}
}

B. Applejack and Storages

题目理解:用所给长度木条组成一个正方形和一个长方形(也可以是正方形)。
思路:先统计不同长度木板个数,并分为大于8,大于6,大于4,大于2(方便讨论最后是否能组成要求图形)用cnt[4]存放。
然后根据题目增减木条个数。先记录下来更改前木条对应的档次,将他减少,再记录更改后的档次,将他加一。(注意:注释中的flag=4,不能少,少了会个数小于二时flag默认为0,导致数据出错)

#include
#include
#include
#include 
#include 
#include  
#include 
#include 
#include 
#include
#include 
#define M 100
#define ll long long 
using namespace std;
const int N=1e5+5;
int a[N],b[N];	int cnt[4];
bool cmp(int a,int b){
	return a>b;
}
int main(){
	memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		a[x]++;
		b[x]++;
	}
		sort(a+1,a+N,cmp);
	    for(int i=0;i<N;i++){
		if(a[i]>=8) cnt[0]++;
		else if(a[i]>=6) cnt[1]++;
		else if(a[i]>=4) cnt[2]++;
		else if(a[i]>=2) cnt[3]++;		
	}
	int m;
	scanf("%d",&m);
	getchar();
	while(m--){
		char c;	int flag,flag1;
		int k;
		scanf("%c %d",&c,&k);
		if(c=='+'){
		
			int num=b[k];
			if(num>=8) flag=0;
			else if(num>=6) flag=1;
		    else if(num>=4) flag=2;
		    else if(num>=2) flag=3;	
		    else flag=4;//不能少
			b[k]++;
			if(b[k]>=8) flag1=0;
			else if(b[k]>=6) flag1=1;
		    else if(b[k]>=4) flag1=2;
		    else if(b[k]>=2) flag1=3;	
		    else flag1=4;//不能少
		}
		else{
		
			int num=b[k];
			if(num>=8) flag=0;
			else if(num>=6) flag=1;
		    else if(num>=4) flag=2;
		    else if(num>=2) flag=3;	
		    else flag=4;//不能少
			b[k]--;
			if(b[k]>=8) flag1=0;
			else if(b[k]>=6) flag1=1;
		    else if(b[k]>=4) flag1=2;
		    else if(b[k]>=2) flag1=3;	
		    else flag1=4; //不能少
		}
    if(flag>=0&&flag<4)cnt[flag]--;
	if(flag1>=0&&flag1<4) cnt[flag1]++;
	if(cnt[0]>0) printf("YES\n");
	else if(cnt[1]>1||cnt[1]>0&&(cnt[2]>0||cnt[3]>0)) printf("YES\n");
	else if(cnt[2]>=2||(cnt[2]>=1&&cnt[3]>=2)) printf("YES\n");
	else printf("NO\n");
	getchar();
	}
	
	
}

C. Pinkie Pie Eats Patty-cakes

题目理解:给一串数字,存在相同的数据,使得两个相同数据间隔的最小值最大。
Codeforces Round #662 (Div. 2)补题_第1张图片

#include
#include
#include
#include 
#include 
#include  
#include 
#include 
#include 
#include
#include 
#define ll long long 
using namespace std;
const int N=2e5+5;
int a[N];
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		memset(a,0,sizeof(a));
		int n,maxx=-1,cnt=0;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			int k;
			scanf("%d",&k);
			a[k]++;
		}
		for(int i=1;i<=n;i++){
			maxx=max(maxx,a[i]);
		}
		for(int i=1;i<=n;i++){
			if(a[i]==maxx) cnt++;
		}
	//	printf("ma=%d cnt=%d\n",maxx,cnt);
		printf("%d\n",(n-maxx*cnt)/(maxx-1)+cnt-1);
		
	}
	
}

你可能感兴趣的:(Codeforces Round #662 (Div. 2)补题)