Codeforces Round #698 (Div. 2)

A Nezzar and Colorful Balls

题意: 有一串非递减数列,你要涂色,保证有相同颜色的数组都是严格递增的,问最少要几种颜色。
思路: 直接找最多有几个相同的数就行了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1007];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		memset(a,0,sizeof a);
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			int x;
			cin>>x;
			a[x]++;
		}
		int maxx=0;
		for(int i=1;i<=n;i++)
		{
			if(maxx<a[i])maxx=a[i];
		}
		printf("%d\n",maxx);
	} 
	return 0;
}

B. Nezzar and Lucky Number

题意: 给你一个k,然后给你数字,你要把这个数字拆成几个数(或者不拆)使得这几个数字中都含有k。
思路: 在10k之前的数字,我们 提前把可能有的余数都预处理出来,就是把那个数字对k取余,然后看这个余数是否可能组成含k的数字,打表也行。大于10k的数字全部都是yes,因为上面全部拆成k,然后余数放到k*10的那里,就必然可以成功。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int mp[15];
int a[1007];
int check(int x,int d,int dis)
{
	for(int i=1;i<=min(x,9);i++)
	{
		if(mp[i]==dis%d)
		{
			return 1;
		}
	}
	return 0;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,d;
		scanf("%d%d",&n,&d);
		int s=0;
		memset(mp,0,sizeof 0);
		for(int i=1;i<=9;i++)
		{	
			s=s+d;
			if(s%10<d)
				mp[i]=d-s%10;
			else{
				mp[i]=0;
			}
		}
		for(int i=1;i<=n;i++)
		{
			ll x;
			cin>>x;
			ll cnt=x/d;
			if(cnt>=10||check(cnt,d,x)){
				printf("YES\n");
			}else{
				printf("NO\n");
			}
		}
	}
	return 0;
}

C. Nezzar and Symmetric Array

题意: 很久以前,有一个对称数组a1,a2,…,a2n由2n个不同的整数组成。数组a1,a2,…,a2n称为对称的,如果对于每个整数1≤i≤2n,存在一个整数1≤j≤2n,使得ai=−aj。
对于每个整数1≤i≤2n,Nezzar写下一个整数di,等于ai与a中所有整数的绝对差之和,即di=∑2nj=1 | ai−aj |。
现在一百万年过去了,尼扎尔几乎记不起数组d,完全忘记了a。尼扎尔想知道是否存在由2n个不同整数组成的对称数组a来生成数组d。

思路: 你自己写两个数,比如 1,-1,2,-2,3,-3,4,-4,然后就可以发现,组合出来就是20,22,26,28四种d然后就有
1 -1……2 -2……3 -3……4 -4
2……4……6……8 1 -1
4……4……6……8 2 -2
6……6……6……8 3 -3
8……8……8……8 4 -4
然后就可以发现规律,最大的d除以n就是最大的那个数,然后每两个数之间的规律是x-=(a[i+2]-a[i])/((i+1)/2);,这时我们就把公式推出来了,最后如果x算出来x小于0就不行。(注意,一定要在过程中判断奇偶数,必须全是偶数,因为我们是把a和-a合起来算的,所以都是双份,还有在算除法时要先看能不能除尽!!!!!!!)我昨天的cf打c题直接少看了能不能除尽,直接血穿,疯狂掉分。。。。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200007];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		for(int i=1;i<=2*n;i++)
		{
			scanf("%lld",&a[i]);
		}
		sort(a+1,a+1+2*n);
		int flag=0;
		ll x=a[2*n]/n;
		if(x%2==1)flag=1;
		if(a[2*n]%n!=0)flag=1;
		int cnt=0;
		for(int i=1;i<2*n;i+=2)
		{
			int j=i+2;
			if(j>2*n)break;
			if(a[i]!=a[i+1])flag=1;
			if(a[i]%2==1)flag=1;
			if(a[j]==a[i])flag=1;
			if((a[j]-a[i])%2==1)flag=1;
			if((a[j]-a[i])%((i+1)/2)==0)
			{
				x-=(a[j]-a[i])/((i+1)/2);
				if(x%2==1)flag=1;
			}				
			else flag=1;
		}
		if(a[2*n-1]!=a[2*n])flag=1;
		if(a[2*n-1]%2==1)flag=1;
		if(n!=1)if(x<=0||x%2==1)flag=1;
		if(flag==1)printf("NO\n");
		else printf("YES\n");
		for(int i=1;i<=2*n;i++)
		{
			a[i]=0;
		}
	}
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值