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;
}