题意:
元音放在奇数位,辅音放在偶数位,元音个数不超过21个,辅音不超过5个。满足以上条件的同时以最小字典序输出。
太懒了 不想优化
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,cnt = 1;
char v[6] ="AUEOI";
char c[23] = "JSBKTCLDMVNWFXGPYHQZR";
struct word
{
char s;
int vis;
}ST[25];
int cmp(struct word a, struct word b)
{
if(a.s > b.s)return 0;
if(a.s < b.s)return 1;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int CASE;
scanf("%d",&CASE);
while(CASE--)
{
int N;
scanf("%d",&N);
char name[300];
int v_n = 0,t,l;
t = N/2;
if(N%2!=0)t++;
T = t/21;
int flag = 0;
if(t%21 !=0){ T++; flag = 1;}
for(int i = 0; i < T; i++)
{
ST[i].s = v[i];
ST[i].vis = 21;
if(flag&& i == T-1)ST[i].vis = t%21;
}
sort(ST,ST+T,cmp);//字典序
int j = 1,k = 0;
for(int i = 0 ; i < t ;i++)
{
if(j > ST[k].vis){j = 1;k++;}
name[2*i] = ST[k].s;
j++;
}
t = N/2;//辅音的总个数
T = t/5;
flag = 0;
if(t%5 !=0){ T++; flag = 1;}
for(int i = 0; i < T; i++)
{
ST[i].s = c[i];
ST[i].vis = 5;
if(flag&& i == T-1)ST[i].vis = t%5;
}
sort(ST,ST+T,cmp);//字典序
j = 1,k = 0;
for(int i = 0 ; i < t ;i++)
{
if(j > ST[k].vis){j = 1;k++;}
name[2*i+1] = ST[k].s;
j++;
}
name[N] = '\0';
printf("Case %d: %s\n",cnt++,name);
}
return 0;
}