Educational Codeforces Round 51 C. Vasya and Multisets(思維+模擬)
阿新 • • 發佈:2018-12-19
C. Vasya and Multisets
題意:
定義了一個nice數,一個集合中的一個數只出現了一次,那麼這個數就是nice數,讓你把n個數分成兩個集合,使得兩個集合中nice數的數量相等
題解:
不難發現,一個數的數量為2時,無論怎麼分,都不會有影響,數量 >=3 的數可以靈活變通,即可以全部放進一個集合,貢獻為0,
也可以拿一個放進第一個集合,其他放進第二個集合,那它對第一個集合的貢獻為1,第二個的貢獻為0
AC程式碼:
#include<iostream> using namespace std; int vis[202]; int arr[202]; int tig[202]; int num[202]; int main() { int n; cin>>n; for(int i=0;i<n;++i) { cin>>arr[i]; num[arr[i]]++; } int a=0,b=0; for(int i=0;i<105;++i) { if(num[i]==1) a++; else if(num[i]>2) b++; } if(b==0&&(a&1)) cout<<"NO"; else { if(a&1) a=a+1; //使得兩個集合的nice數都為a/2 int m = a/2; int k = a/2; for(int i=0;i<n;++i) //先處理數量為1的數 { if(num[arr[i]]==1) { if(m) { vis[i] = 1; m--; } else if(k) { vis[i] = 2; k--; } } else if(num[arr[i]]==2) vis[i] = 1; } for(int i=0;i<n;++i) { if(num[arr[i]]!=1) { if(!tig[arr[i]]) // 數量>=3的數拿一個放進一個集合,其它的放進另一個集合 { if(m) { tig[arr[i]] = 1; vis[i] = 1; m--; } else if(k) { vis[i] = 2; tig[arr[i]] = 2; k--; } else vis[i]=1; //兩個集合的nice數都夠了 } else { if(tig[arr[i]]==1) vis[i] = 2; else vis[i] = 1; } } } cout<<"YES"<<endl; for(int i=0;i<n;++i) { if(vis[i]==1) cout<<'A'; else cout<<'B'; } } return 0; }