Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14370
  • 博文数量: 3
  • 博客积分: 105
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-15 22:52
文章分类

全部博文(3)

文章存档

2012年(3)

我的朋友
最近访客

分类: C/C++

2012-06-02 13:37:24

POJ 1207 The 3n + 1 problem

题意:著名的3n+1问题就是说任何一个数字N经过如下操作后一定能到达1.
如果N是偶数,则N=N/2,否则N为奇数就N=N*3+1。如此下去得到一组数,我们可以求得给定的N的这组数的长度。如N=22,则22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 所求序列,长度为16。
现在给你两个数X,Y,求在X和Y之间(包括X和Y)的所有数中上述序列最长的长度并输出。
思路:直接对N模拟执行上述操作,求出序列长度L。要注意的是有可能存在X>Y的情况。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int cal(int x)
  3. {
  4.     int ans=1;
  5.     while(x!=1)
  6.     {
  7.         if(x%2) x=3*x+1;
  8.         else x/=2;
  9.         ans++;
  10.     }
  11.     return ans;
  12. }
  13. int main()
  14. {
  15.     int x,y,t,i,ans;
  16.     while(scanf("%d%d",&x,&y)!=EOF)
  17.     {
  18.         printf("%d %d ",x,y);
  19.         if(x>y) t=x,x=y,y=t;
  20.         ans=0;
  21.         for(i=x;i<=y;i++) if((t=cal(i))>ans)
  22.             ans=t;
  23.         printf("%d\n",ans);
  24.     }
  25.     return 0;
  26. }

POJ 1218 THE DRUNK JAILER
题意:有N个锁着的房间(编号为1~N),每次对房间的操作都是和房间当前状态相反的操作,即原来锁着的就打开,原来开着的就锁上。现在有N轮操作,第X轮操作就是把X倍数的房间进行操作。问最后开着的房间共有几个?
思路1:简单模拟上述过程。其中用到了内存清空函数memset和取反操作!

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>
  4. int a[120];
  5. int main()
  6. {
  7.     int t,n,i,j,ans;
  8.     scanf("%d",&t);
  9.     while(t--)
  10.     {
  11.         ans=0;
  12.         memset(a,0,sizeof(a));
  13.         scanf("%d",&n);
  14.         for(i=1;i<=n;i++) for(j=1;i*j<=n;j++)
  15.             a[i*j]=!a[i*j];
  16.         for(i=1;i<=n;i++) if(a[i])
  17.             ans++;
  18.         printf("%d\n",ans);
  19.     }
  20.     return 0;
  21. }
思路2:考虑每个房间最后的状态,比如房间4,它在第1、2、4轮分别被执行操作,所以最后是开着的。那对于房间F,就是在F的约数时被执行操作,并且最后如果F有奇数个约数则房间最后是开着的。设F=p1^k1*p2^k2...,则F的约数个数为(k1+1)*(k2+1)...,可以看出k1,k2...必须全部为偶数才能满足约数个数为奇数个,其实也就是F必须为平方数时才满足。所以最后开着的房间数就是有多少个小于等于N的平方数。ans=(int)sqrt(n); 

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5.     int T,n;
  6.     scanf("%d",&T);
  7.     while(T--)
  8.     {
  9.         scanf("%d",&n);
  10.         printf("%d\n",(int)sqrt(1.0*n));
  11.     }
  12.     return 0;
  13. }
POJ 3094 Quicksum
题意:计算每个字符串的值。计算方法如下:ACM: 1*1 + 2*3 + 3*13 = 46

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. char s[285];
  3. int main()
  4. {
  5.     int i,ans;
  6.     while(gets(s) && s[0]!='#')
  7.     {
  8.         ans=0;
  9.         for(i=0;s[i];i++)
  10.         {
  11.             if(s[i]==' ')    continue;
  12.             ans+=(i+1)*(s[i]-'A'+1);
  13.         }
  14.         printf("%d\n",ans);
  15.     }
  16.     return 0;
  17. }
POJ 2350 Above Average
题意:求出一个数组中比平均数大的数所占的比例。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int a[1200];
  3. int main()
  4. {
  5.     int T,n,i,ans;
  6.     double s;
  7.     scanf("%d",&T);
  8.     while(T--)
  9.     {
  10.         scanf("%d",&n);
  11.         s=0.0; ans=0;
  12.         for(i=0;i<n;i++)
  13.         {
  14.             scanf("%d",&a[i]);
  15.             s+=a[i];
  16.         }
  17.         s/=n;
  18.         for(i=0;i<n;i++) if(a[i]>s)
  19.             ans++;
  20.         printf("%.3lf%%\n",ans*100.0/n);
  21.     }
  22.     return 0;
  23. }
POJ 1833 排列
题意:求一个数列的下K个排列。用next_permutation()。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <algorithm>
  3. using namespace std;
  4. int a[1028];
  5. int main()
  6. {
  7.     int T,n,k,i;
  8.     scanf("%d",&T);
  9.     while(T--)
  10.     {
  11.         scanf("%d%d",&n,&k);
  12.         for(i=0;i<n;i++) scanf("%d",&a[i]);
  13.         while(k--) next_permutation(a,a+n);
  14.         for(i=0;i<n-1;i++) printf("%d ",a[i]);
  15.         printf("%d\n",a[i]);
  16.     }
  17.     return 0;
  18. }
POJ 2608 Soundex
题意:每个字母都有一个映射码,给你一个字符串让你输出映射码。但有些字母没有映射码则不输出,且相邻两个字母如果映射码相同则只输出一个。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. char s[25];
  3. char map[27]="01230120022455012623010202";
  4. int main()
  5. {
  6.     int i;
  7.     while(scanf("%s",s)!=EOF)
  8.     {
  9.         for(i=0;s[i];i++) if(map[s[i]-'A']!='0' && map[s[i]-'A']!=map[s[i-1]-'A'])
  10.             printf("%c",map[s[i]-'A']);
  11.         printf("\n");
  12.     }
  13.     return 0;
  14. }

阅读(981) | 评论(0) | 转发(0) |
0

上一篇:2012级第二次训练题解

下一篇:没有了

给主人留下些什么吧!~~