Codeforces Round #698 (Div. 2)

Codeforces Round #698 (Div. 2)

https://codeforces.com/contest/1478

A. Nezzar and Colorful Balls

思路

水题,直接求出每个数字的最大次数即可。

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 
 
const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=2e5+7;
const ll mod=998244353;       

int main(){ 
    IO;
    int t=1;
    cin>>t;
    while(t--){ 
        int n;
        cin>>n;
        map<int,int>mp;
        for (int i = 0; i < n; ++i)
        {
            int x;
            cin>>x;
            mp[x]++;
        }int maxn=0;
        for (int i = 1; i <= n; ++i)
        {
            maxn=max(maxn,mp[i]);
        }cout<<maxn<<endl;
    }
    return 0;
}

B. Nezzar and Lucky Number

思路

x是否为包含d的数之和。

首先考虑x很大的情况,当x大于等于d×10的时候,x=d×10显然成立,当x大于d×10时,必然存在两个位数中包含d的数之和为x,其中一个十位为d,另一个个位为d则必然存在满足条件的解;

当x小于d×10时,d只能出现在个位,将10×d以内的d的所有倍数的个位存下来,

  • 与x判断如果x的个位没有出现过则无法得到;
  • 如果x的个位出现过但是x小于d的倍数中最小的与x个位相同的数则同样无法得到;
  • 只有x大于等于它时,可以通过改变十位的值相加得到x。

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 
 
const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=2e5+7;
const ll mod=998244353;       

int main(){ 
    IO;
    int t=1;
    cin>>t;
    while(t--){ 
        ll q,d;
        cin>>q>>d;
        vector<ll>v;
        map<int,int>mp; 
        for (int i = 1; i <= 10; ++i)
        {
            int k=i*d;
            if(!mp[k%10]){
                v.push_back(k);
                mp[k%10]=int(v.size());
            }
        }
        for (int i = 0; i < q; ++i)
        {
            ll x;
            cin>>x; 
            if(x>=d*10){
                cout<<"YES"<<endl;
                continue;
            }
            if(!mp[x%10]){
                cout<<"NO"<<endl;
                continue;
            }
            if(x<v[mp[x%10]-1]){
                cout<<"NO"<<endl;
                continue;
            }cout<<"YES"<<endl;
        }
    }
    return 0;
}

C. Nezzar and Symmetric Array

思路

由题意可以知道d数组一定由n对相同的数组成。

假设原来数组中的正数由a1、a2、a3、a4组成(且a1<a2<a3<a4),则这几个数的di为:

  • d1=a2-a1+a3-a1+a4-a1+a1+a1+a1+a2+a1+a3+a1+a4=2×a1+2×a2+2×a3+2×a4
  • d2=a2-a1+a3-a2+a4-a2+a1+a2+a2+a2+a2+a3+a2+a4=4×a2+2×a3+2×a4
  • d3=a3-a1+a3-a2+a4-a3+a1+a3+a2+a3+a3+a3+a3+a4=6×a3+2×a4
  • d4=a4-a1+a4-a2+a4-a3+a1+a4+a2+a4+a3+a4+a4+a4=8×a4

由此可推得: di=2×i×a[i]+2×\(\sum_j^n\)ai。 (j=i+1)
(最后注意特判一下是否存在ai为0的情况,此类不满足要求)

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 

const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=1e5+7;
const ll mod=1e9+7;   

ll a[N];  

int main(){ 
    IO;
    int t=1;
    cin>>t;
    while(t--){ 
    	ll n;
        cin>>n;
        vector<ll>b,v,u;
        map<ll,int>mp;
        for (int i = 0; i < 2*n; ++i)
        {
            ll x;
            cin>>x;
            if(!mp[x]){
                b.push_back(x);
            }mp[x]=1;
        }
        if(int(b.size())!=n){
            cout<<"NO"<<endl;
            continue;
        }
        if(n==1){
            if(b[0]%2)cout<<"NO"<<endl;
            else cout<<"YES"<<endl;
            continue;
        }
        sort(b.begin(),b.end());
        ll sum=0;
        int flag=1;
        for (ll i = n-1ll; i >= 0; --i)
        {
            if((b[i]-sum)%(2ll*(i+1ll))){ 
                flag=0;break;
            }
            a[i]=(b[i]-sum)/(2ll*(i+1ll));
            sum+=2ll*a[i];
        }mp.clear();
        for (int i = 0; i < n; ++i)
        { 
            if(mp[a[i]]||a[i]<1){
                flag=0;
                break;
            }mp[a[i]]=1;
        } 
        if(!flag)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;

    }
    return 0;
}

继续加油!!!

posted @ 2021-01-29 10:13  !^^!  阅读(274)  评论(0)    收藏  举报