Avito Cool Challenge 2018 A. B題解
阿新 • • 發佈:2018-12-18
A. Definite Game
題目連結:https://codeforces.com/contest/1081/problem/A
題意:
給出一個數v,然後讓你可以重複多次減去一個數d,滿足v%d!=0,問最後可以得到最小的是多少。
題解:
除開v=2輸出2,其餘直接輸出1就行了= =/
程式碼如下:
#include <bits/stdc++.h> using namespace std; int main(){ int v; cin>>v; cout<<(v==2 ? 2 : 1);return 0; }
B. Farewell Party
題目連結:https://codeforces.com/contest/1081/problem/B
題意:
有n種顏色,每種顏色都有ai種顏色與之不同。現在要求輸出bi,bi代表第i個顏色的種類。
如果沒有合法的情況,則輸出"Impossible"。
題解:
資料範圍告訴我們應該用O(nlogn)的解法。
首先我們知道,對於第i個顏色,有ai種顏色與之不同,那麼就有n-ai種顏色與之相同。
那麼我們可以考慮排個序,算出每個位置的顏色有多少是應與之相同的,並計算出ai的個數cnt[ai]。
我們可以貪心地想把cnt[ai
最後直接輸出就行了。這題是special judge。
程式碼如下:
#include <bits/stdc++.h> using namespace std; typedef long long ll ; const int N = 1e5+5; int b[N],cnt[N]; int n; struct node{ int v,pos; bool operator < (const node &A)const{return v<A.v; } }a[N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i].v); a[i].pos=i; } sort(a+1,a+n+1); int flag=0; a[0].v=-1;a[n+1].v=-1; for(int i=1;i<=n;i++){ int v = a[i].v; cnt[v]++; } for(int i=1;i<=n+1;i++){ if(a[i].v==a[i-1].v) continue ; int need=n-a[i].v; if(cnt[a[i].v]%need!=0){ flag=1;break; } } if(flag){ printf("Impossible"); }else{ int tot=0; for(int i=1;i<=n;i++){ int v=a[i].v; int need=n-a[i].v; if(cnt[v]%need==0) tot++; cnt[v]--; b[a[i].pos]=tot; } printf("Possible\n"); for(int i=1;i<=n;i++) printf("%d ",b[i]); } return 0; }