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$。
时间: 2024-10-03 23:06:48