题意:题目是要构造长度为n的串,有以下要求,1.元音和辅音的值都最小,值定义见题目;2.先放元音再放辅音,一直这样交替;3.任一个辅音字母不超过5次,任一个元音字母不超过21次;4.在满足上述要求的情况下,保持字母序,而且首要保证的是条件1,其次才考虑条件4的字母序。
思路:对于条件1,不用计算,也不用考虑他俩值的和最小后、会不会一个大而另一个小,因为每次其实都是取最小值的元音和辅音的~ 这样的话,我的思路是,把元音和辅音重复它应有的次数,顺序存在各自的数组里,而且是按倒序存,这样在构造时,交替拿元音数组和辅音数组,而且每次都是拿数组的最后一个元素,拿完之后将数组长度减1即可。到这都很清晰,容易忽略的是条件4,从数组的构造来看,J和S已经是按照字母序排的,所以容易认为条件4是已经满足了的,但是对于不同列来说,其实字母序没满足,比如同时有J和B时,按上述那种方法J虽然在S前面,但它们也都在B前面。所以,修改一下,将拿出来的元音和辅音各存于一数组,结束后排序,然后两个数组交替拿,来构造最终的结果。
注意:主要就是容易忽略条件4的不同列之间的字母序的保证。即,比如J和B的顺序。
另:之前关注一个人,发现她这个题与上一题的发布时间差比较大,以为她调这个题多长时间,以为这个题有多难或者有陷进呢,结果看完题感觉也不是很难,就一直在怀疑是不是有什么陷进或忽略的地方~反正就是一直没能及时把这个题切掉,其实这个题挺简单的~唉,又让我想起那个感悟:小马过河。其实不同的人对于同一件事的体验或感觉可能是不同的,别人的意见或建议当然可以参考,但千万不要被别人的一些东西所左右或影响,很多事情有的人说好有的人说不好、有的人说难有的人说不难,都只是个小马过河的问题。(发现小学时的这篇文章写的真好,很多年以后才真正明白这些道理~)
AC了之后看那个人的那篇内容(之前只是看了个题目列表看了个时间),她直接说的就是这题挺简单~⊙﹏⊙b汗,早知道点开看一下了~
今天不知道为什么有点不开心。。。 下周一轮到我讲论文了(不是因为这个不开心~),要好好看论文好好搞研究,研究不能落下,加油~
如果事业不能永恒,爱情也只是昙花一现!加油~
(发现自己就像写流水账一样。。以后写精简些吧~)
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 21*5+5
void construct(int n);
int cmp_c(const void *_a,const void *_b);
char vowel[M];
char consnt[M];
char cons[]="RZQHYPGXFWNVMDLCTKBSJ";
char vowel2[M];
char consnt2[M];
char res[215];
char ores[110];
char eres[110];
int main()
{
int k=0;
for(int i=0;i<21;++i)
vowel[k++]=‘I‘;
for(int i=0;i<21;++i)
vowel[k++]=‘O‘;
for(int i=0;i<21;++i)
vowel[k++]=‘E‘;
for(int i=0;i<21;++i)
vowel[k++]=‘U‘;
for(int i=0;i<21;++i)
vowel[k++]=‘A‘;
vowel[k++]=‘\0‘;
k=0;
for(int i=0;i<strlen(cons);++i)
for(int j=0;j<5;++j)
consnt[k++]=cons[i];
consnt[k++]=‘\0‘;
int n=0;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
strcpy(vowel2,vowel);
strcpy(consnt2,consnt);
int len=0;
scanf("%d",&len);
construct(len);
printf("Case %d: %s\n",i+1,res);
}
system("pause");
return 0;
}
void construct(int n)
{
memset(res,0,sizeof(res));
memset(ores,0,sizeof(ores));
memset(eres,0,sizeof(eres));
bool flag=1;
for(int i=0;i<n;++i)
{
if(flag)
{//放元音
int len=strlen(vowel2);
ores[i/2]=vowel2[len-1];
vowel2[len-1]=‘\0‘;
flag=!flag;
}
else
{
int len=strlen(consnt2);
eres[i/2]=consnt2[len-1];
consnt2[len-1]=‘\0‘;
flag=!flag;
}
}//for
int num=n/2;
if(n%2!=0) num=num+1;
qsort(ores,num,sizeof(char),cmp_c);
qsort(eres,n/2,sizeof(char),cmp_c);
for(int i=0;i<n;++i)
{
if(i%2==0) res[i]=ores[i/2];
else res[i]=eres[i/2];
}
}
int cmp_c(const void *_a,const void *_b)
{
char *a=(char*)_a;
char *b=(char*)_b;
return *a-*b;
}
UVa 10785 疯狂的命理学家,布布扣,bubuko.com
原文:http://blog.csdn.net/buxizhizhou530/article/details/21981339