1. 程式人生 > >Avito Cool Challenge 2018 A. B題解

Avito Cool Challenge 2018 A. B題解

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

]分為cnt[ai]/(n-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; }