首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。