首页 > 代码库 > topcoder srm 689 div1 -3

topcoder srm 689 div1 -3

1、给出一个$2*n$的矩阵,只包含小写字母。重新排列各个元素使得任意两个相邻的元素不相同?

思路:按照每种字符的数量降序排序,然后从多到少依次放每一种。放的时候一上一下交错放置。

#include <stdio.h>#include <string>#include <stack>#include <vector>#include <string.h>#include <algorithm>#include <assert.h>using namespace std;const int N=100005;class ColorfulGarden{public:    vector<string> rearrange(vector<string> A)    {        pair<int,int> a[26];        for(int i=0;i<26;++i) a[i].first=0,a[i].second=i;        const int n=(int)A[0].size();        const string p=A[0];        const string q=A[1];        for(int i=0;i<n;++i) ++a[p[i]-‘a‘].first;        for(int i=0;i<n;++i) ++a[q[i]-‘a‘].first;        sort(a,a+26);        reverse(a,a+26);        vector<string> B;        if(a[0].first>n) return B;        vector<char> all;        for(int i=0;i<26;++i)        {            while(a[i].first--) all.push_back(‘a‘+a[i].second);        }        char ans[2][55];        memset(ans,0,sizeof(ans));        for(int i=0;i<n;++i)        {            if(i&1) ans[0][i]=all[i];            else ans[1][i]=all[i];        }        for(int i=n;i<n+n;++i)        {            if((i-n)&1) ans[1][i-n]=all[i];            else ans[0][i-n]=all[i];        }        string s1="",s2="";        for(int i=0;i<n;++i)        {            s1+=ans[0][i];            s2+=ans[1][i];        }        B.push_back(s1);        B.push_back(s2);        return B;    }};

2、构造一个$n*n$的二维数字表$A$,满足:(1)表中所有的数字范围为$[0,n-1]$,(2)$A$的所有‘good‘子集个数恰好为$x$。‘good‘子集的定义为对于从$[0,n-1]$中选出的一个非空子集$T$,任意的$i,j \in T$,那么$A_{i,j} \in T$。

 

topcoder srm 689 div1 -3