1. 程式人生 > >Educational Codeforces Round 51 C. Vasya and Multisets(思維+模擬)

Educational Codeforces Round 51 C. Vasya and Multisets(思維+模擬)

                                            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;
}