Codeforces Round #698 (Div. 2)
A. Nezzar and Colorful Balls
签到题:
#include<bits/stdc++.h> #define ll long long using namespace std; int a[110]; int main() { int t; cin>>t; while(t--) { int n; cin>>n; int ans = 0; for(int i=1;i<=n;i++) { cin>>a[i]; } int q = 1; for(int i=1;i<=n;i++) { if(a[i]==a[i-1]) { q++; } else{ ans = max(q,ans); q = 1; } } ans = max(q,ans); cout<<ans<<endl; } }
B. Nezzar and Lucky Number
题意:给出n个询问数,和一个幸运数字,看他能不能被几个带幸运数字的数或者幸运数字的倍数相加而得到。
题解:只要看给出的d*10之间的讨论一下,看哪几个是不可能的,大于等于d*10的都是可以的。
#include<bits/stdc++.h> #define ll long long using namespace std; int a[110]; int q,d; map<int,int>mp; void init() { for(int i=1;i<=10;i++) { int ans = d*i; for(int j=0;ans+j<=d*10;j+=10) { mp[j+ans] = 1; } } } int main() { int t; cin>>t; while(t--) { cin>>q>>d; mp.clear(); init(); while(q--) { int x; cin>>x; //cout<<mp[x]<<endl; if(x<=d*10&&mp[x] == 1) { puts("YES"); continue; } if(x>d*10) { puts("YES"); continue; } puts("NO"); } } }
C. Nezzar and Symmetric Arrary
题意:给出2*n个数字,看是否能构造出2*n个数a[i],且每个数都能在数组找到相反数即b[i] 存在b[j]==-b[i](j!=i),a[i] = 。
题解:a数组必须满组不同的个数为n,不能出现奇数,sum = sum+ (b[i]/2-sum)/i,满足(b[i]/2-sum)>0&&(b[i]/2-sum)%i==0。
-4 -3 -2 -1 0 1 2 3 4
不难发现4到3和-3的距离和=2 * 4 ,4到-2 2和4到-1 1的距离和也都为2 * 4,在此可以发现规律一个较大的数到两个较小的数的距离和等于其自身二倍。
观察0 1 2 -1 -2…到4 -4的距离和为都为2*4,又发现了一个规律一个绝对值较小的数和两个绝对值比它大的正负数的距离和=二倍大数的绝对值。
#include<bits/stdc++.h> /*#if(__cplusplus == 201103L) #include <unordered_map> #include <unordered_set> #else #include <tr1/unordered_map> #include <tr1/unordered_set> namespace std { using std::tr1::unordered_map; using std::tr1::unordered_set; } #endif*/ #define ll long long int using namespace std; ll a[200005]; ll b[200005]; inline ll rd() { ll x = 0; ll f = 1; char ch = getchar(); while(ch<'0'||ch>'9') { if(ch == '-') f = -f; ch = getchar(); } while(ch>='0'&&ch<='9') { x = x*10 + ch - '0'; ch = getchar(); } return f*x; } int t; //int n; //int a[N]; map<ll,int> mp; bool cmp(int aa,int bb) { return bb>aa; } ll c[200005]; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>t; while(t--){ bool flag = true; int n; cin>>n; for(int i=1;i<=2*n;i++) { cin>>a[i]; if(a[i]%2) { flag = false; } } sort(a+1,a+1+2*n); int ans = 1; for(int i=1;i<=2*n;i+=2) { b[ans++] = a[i]; if(a[i]!=a[i+1]||a[i]==a[i+2]) { flag = false; } } //sort(b+1,b+n+1,cmp); ll sum = 0; for(int i=n;i>=1;i--) { if((b[i]/2-sum)<=0||(b[i]/2-sum)%i!=0) { flag = false; break; } sum = sum+ (b[i]/2-sum)/i; //cout<<b[i]<<" "<<sum<<endl; } if(flag) puts("YES"); else puts("NO"); } return 0; }