菜鸡又开始卑微上分了,然而昨天的体验属实不太快乐,先是桶排写错范围,又是无情Debug一个小时,希望往后的复健运动能阳间一点。
A.Nezzar and Colorful Balls
思路:桶排求出重复最多的值就可以了。
#include <bits/stdc++.h>
using namespace std;
const int N=105;
int a[N];
int main()
{
int t,n;
cin>>t;
for(int i=0;i<t;i++)
{
cin>>n;
int ans=-1;
memset(a,0,sizeof(a));
for(int j=1;j<=n;j++)
{
int x;
cin>>x;
a[x]++;
}
for(int j=1;j<=105;j++)ans=max(ans,a[j]);
cout<<ans<<endl;
}
return 0;
}
B. Nezzar and Lucky Number
思路:一开始想暴力,但是枚举到3位数的时候就觉得暴力不可行了,以7来举例子,一位数的7有7,二位数的7有17,77,三位数的7有107~997实在是太多了,打表都十分费时,所以暴力枚举再相加不可取。因此要按照取余的余数来做,放个图就明白了。
当一个数字x大于等于10倍的d时那么它必然可以被含有d幸运数字以一个幸运数字加若干个d组成,当一个数字小于等于10倍的d时,只要看它的余数,如果它大于等于由它的余数加一定的d得到的幸运数字,则它必然可以被这个幸运数字加若干个d得到,所以只要算出每一个余数加一定量的d所得到的第一个幸运数字就行,要注意的是偶数的时候,个位可能不会产生d,所以就把这一个余数的幸运数字置为d的十倍加任何数字都可以。
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;
const int M=15;
int t,q,d;
int a[M][M];
bool f[M];
int main()
{
scanf("%d",&t);
while(t--)
{
int idx=1,k=10;
scanf("%d%d",&q,&d);
if(!f[d])
{
for(int i=1; i<d; i++)
{
int tmp=i;
while(1)
{
tmp+=d;
if(((tmp%10)%d)==0&&(tmp%10)!=0)break;
if(tmp>=10000)break;
}
a[d][i]=tmp;
}
f[d]=1;
}
//cout<<"Has break"<<endl;
for(int i=0; i<q; i++)
{
int x;
scanf("%d",&x);
if(x>=d*10)printf("YES\n");
else
{
int tmp=x%d;
if(tmp==0||x>=a[d][tmp])printf("YES\n");
else printf("NO\n");
}
}
}
return 0;
}
C. Nezzar and Symmetric Array
思路:这个C题可以说是非常的抽象了,非常考验把条件转化为代码的能力,首先我们假设n=4,则a数组必然包含:a1,a2,a3,a4,-a1,-a2,-a3,-a4,我们将其从1-n从小到大排序,再将其从n+1到2n进行从大到小排序,仍然合法,由于a数组中一个数既出现正数,又出现负数,则d数组中必然包含两个相同的数字,因此用一个map来判断数字出现的次数,如果满足每个数字都出现两次,则输入2n次只会有n个不同的数字。
然后我们只需要判断这个d能不能被整除,与算出来的每一个ai是否为正数就行。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int t,n;
ll a[N],b[N];
map<ll,int>vis;
int main()
{
scanf("%d",&t);
while(t--)
{
bool flag=0;
int k=0;
vis.clear();//一定要清空!!!
scanf("%d",&n);
for(int i=1;i<=2*n;i++)
{
scanf("%lld",&a[i]);
if(!vis[a[i]])b[++k]=a[i];
vis[a[i]]++;
if(vis[a[i]]>2)flag=1;
}
if(flag){printf("NO\n");continue;}
sort(b+1,b+k+1);//输入2n个数字,最后会有n个数量为2的数字
for(int i=0;i<k;i++)
{
if(vis[b[i]]==1){flag=1;break;}
}
if(flag){printf("NO\n");continue;}
ll sum=0,x=0;
for(int i=k;i>=1;i--)
{
ll tmp=2*i;
b[i]=b[i]-sum*2;
if(b[i]%tmp||b[i]<=0){flag=1;break;}
x=b[i]/tmp;sum+=x;
}
if(flag)printf("NO\n");
else printf("YES\n");
}
return 0;
}