Codeforces Round #698 (Div. 2)(A-C)

菜鸡又开始卑微上分了,然而昨天的体验属实不太快乐,先是桶排写错范围,又是无情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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值