题意:题目是要构造长度为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