Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21907
  • 博文数量: 12
  • 博客积分: 271
  • 博客等级: 二等列兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 11:17
文章分类

全部博文(12)

文章存档

2012年(12)

我的朋友
最近访客

分类: C/C++

2012-05-26 21:08:11

本次解题实在是状况不断……有时候有思路但是在编写代码的过程中往往就乱掉了。最后编译出来的时候,往往编译没有错但是结果总是不对。
我觉得是我的限时快速编程经验过少。不集中注意力,思路容易乱,所以编出来能运行的程序,但是程序不能做出相应的功能……
这是大忌。



A - The 3n + 1 problem 
解题:
  1. 我的思路是,先判断i,j大小,如果i>j就把他俩的值调换。然后进行for循环,让循环变量a从i循环到j。
  2. 预先定义两个变量m,n;在循环中使用。在定义一个变量k,每次循环记下a的值,然后对k进行题目中的操作,每操作一次,累加器m就+1,(m初值为1)。当对k操作完毕时(k==1),m的值就是操作的次数。n的初值也为1,在while循环中。它的目的是记下进行过的for循环中,m出现过的最大值。 if(m>n) n=m;   //最后输出也是输出n。
  3. 因为程序中i和j的值可能有交换,故我定义一个变量flag记下i和j是否进行了交换。(flag==0则他们没有交换过)。若他们交换过,在输出值之前我要再把i,j换回来。
  4. 以上。

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. void main(void)
  3. {
  4.     int i,j,n,m,k,a,flag=0;
  5.     while(scanf("%d%d",&i,&j)!=EOF)
  6.     {
  7.         if(i>j)
  8.         {
  9.             n=i;i=j;j=n;
  10.             flag=1;
  11.         }
  12.         n=1;
  13.         for(a=i;a<=j;a++)
  14.         {
  15.             m=1;
  16.             k=a;
  17.             while(k!=1)
  18.             {
  19.                 if((k/2)==((k-1)/2))
  20.                     k=3*k+1;
  21.                 else
  22.                     k=k/2;
  23.                 m++;
  24.             }
  25.             if(m>n) n=m;
  26.         }
  27.         if(flag==0)
  28.             printf("%d %d %d\n",i,j,n);
  29.         else
  30.             printf("%d %d %d\n",j,i,n);
  31.     }
  32. }

B - THE DRUNK JAILER
解题:【逃跑问题】
  1. 本程序采用动态申请内存的方法申请整型数组。节省空间。
  2. cha()函数是根据a的值,进行0,1交换。。。
  3. 这样程序思路就很明显了。
  4. 输入case个数N之后,就进入while(N--)循环了。
  5. 首先对数组初始化,值全为1.
  6. 循环内嵌套for循环(循环变量j从2到n),for循环中对数组进行遍历,对于j的倍数,进行cha()函数的值更新。
  7. 最后在此遍历数组,用累加器累加出数组内的1值即可。

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int cha(int a)
  3. {
  4.     if(a) return 0;
  5.     else return 1;
  6. }

  7. int main()
  8. {
  9.     int n,i,j,N;
  10.     scanf("%d",&N);
  11.     while(N--)
  12.     {
  13.         scanf("%d",&n);
  14.         int *p=new int[n];
  15.         for(i=0;i<n;i++)
  16.             p[i]=1;
  17.         for(j=2;j<=n;j++)
  18.         {
  19.             for(i=0;i<n;i++)
  20.                 if((i+1)%j==0)
  21.                     p[i]=cha(p[i]);
  22.         }
  23.         j=0;
  24.         for(i=0;i<n;i++)
  25.         {
  26.             if(p[i])
  27.                 j++;
  28.         }
  29.         printf("%d\n",j);
  30.     }
  31.     return 0;
  32. }
C - Quicksum
解题:{这次读题疏忽,这是第一次不应该犯的错误。忽略了值的范围0-255。所以第一次定义为s[30]造成结果错。}

题目思路简单,位置可以通过数字元素下标+1得出,而字母在字母表中的顺序,可以通过相应ASCII码-64转换得出。故此题关键在于怎么回避空格问题。空格值为0,故加一条判断语句跳过空格继续累加即可。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.     char s[300];
  6.     int i,sum=0;
  7.     gets(s);
  8.     while(strcmp(s,"#"))
  9.     {
  10.         sum=0;
  11.         for(i=0;s[i];i++)
  12.             if(s[i]!=' ')
  13.                 sum+=(i+1)*(s[i]-64);
  14.         printf("%d\n",sum);
  15.         gets(s);
  16.     }
  17.     return 0;
  18. }
D - Above Average
解题:
  1. 首先要注意最后输出格式保留三位小数。  "%.3f%%"。
  2. 为了尽量减少变量的申请。两个变量conc(最后的百分数)和ave平均数有两个功能。
  3. 再累加的时候,ave是累加器。最后通过ave/=n得出平均数。
  4. conc先是表示小数的比例,在最后通过乘以100转化为百分值。
  5. 以上。

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int c,n,a[1000],i;
  5.     float conc,ave;
  6.     scanf("%d",&c);
  7.     while(c--)
  8.     {
  9.         scanf("%d",&n);
  10.         ave=0;
  11.         for(i=0;i<n;i++)
  12.         {
  13.             scanf("%d",&a[i]);
  14.             ave+=a[i];
  15.         }
  16.         ave/=n;
  17.         conc=0;
  18.         for(i=0;i<n;i++)
  19.             if(a[i]>ave)
  20.                 conc++;
  21.         conc=100*conc/n;
  22.         printf("%.3f%%\n",conc);
  23.     }
  24. }
E - 排列
解题:第一次遇见中文题~~~XD
  1. 全排列问题。我再次第二次遇到问题。因为全排列函数第一次碰到。思路完全乱了。
  2. 当知道全排列函数是可以从头继续排的时候,一切都豁然开朗了。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <algorithm>

  4. int a[1030];
  5. using namespace std;

  6. int cmp(const void *a,const void *b)
  7. {
  8.     return *(int *)a-*(int *)b;
  9. }

  10. int main()
  11. {
  12.     int m,n,i,k;
  13.     scanf("%d",&m);
  14.     while(m--)
  15.     {
  16.         scanf("%d%d",&n,&k);
  17.         for(i=0;i<n;i++) scanf("%d",&a[i]);
  18.         do
  19.         {
  20.             k--;
  21.         }while(next_permutation(a,a+n)&&k);
  22.         
  23.         if(k)
  24.         {
  25.             qsort(a,n,sizeof(a[0]),cmp);
  26.             do
  27.             {
  28.                 k--;
  29.                 next_permutation(a,a+n);
  30.             }while(k);
  31.             for(i=0;i<n;i++) printf("%d ",a[i]);
  32.             printf("\n");
  33.         }
  34.         else
  35.         {
  36.             for(i=0;i<n;i++) printf("%d ",a[i]);
  37.             printf("\n");
  38.         }
  39.     }
  40.     return 0;
  41. }
F - Soundex
解题:用子函数,思路会更加清晰。在此我又遇到了问题。return 2;那一句我居然把字母Z忘了。活该做不出来。
  1. 剩下的思路路都还挺简单的,为了避免数字重复的问题。sound(s[i])!=sound(s[i-1])  这一句就可以解决。
  2. 以上。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int sound(char c)
  5. {
  6.     if(c=='B'||c=='F'||c=='P'||c=='V') return 1;
  7.     if(c=='C'||c=='G'||c=='J'||c=='K'||c=='Q'||c=='S'||c=='X'||c=='Z') return 2;
  8.     if(c=='D'||c=='T') return 3;
  9.     if(c=='L') return 4;
  10.     if(c=='M'||c=='N') return 5;
  11.     if(c=='R') return 6;
  12.     return 0;
  13. }

  14. int main()
  15. {
  16.     char s[25];
  17.     int i;
  18.     while(gets(s))
  19.     {
  20.         for(i=0;s[i];i++)
  21.         {
  22.             if(sound(s[i])&&sound(s[i])!=sound(s[i-1]))
  23.             {
  24.                 printf("%d",sound(s[i]));
  25.             }
  26.         }
  27.         printf("\n");
  28.     }
  29. }

阅读(682) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~