首页 > 其他 > 详细

UVa 10785 疯狂的命理学家

时间:2014-03-24 23:38:22      阅读:650      评论:0      收藏:0      [点我收藏+]

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

UVa 10785 疯狂的命理学家

原文:http://blog.csdn.net/buxizhizhou530/article/details/21981339

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!