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

全部博文(3)

文章存档

2012年(3)

我的朋友
最近访客

分类: C/C++

2012-05-26 16:07:15

POJ 1002 487-3279

题意:
输入N个电话号码字符串,你需要对字符串进行变换得到标准格式xxx-xxxxx,然后你要对标准电话号码进行统计,得出每个电话号码出现的次数.最后你要输出的就是按照电话号码的字典序输出那些出现次数超过1次的电话号码,如果没有的话就输出"No duplicates. ".
思路:
这一题有两个难点:1.处理字符串,将电话号码转换成标准格式.2.统计每个电话号码的次数并按字典序输出.
对于第一个难点,我的处理方式是:给出每个字母对应数字的数组,然后将电话号码按照整数处理,比如310-1010就是整数3101010,F101010也是整数3101010.这样的好处就是不用管其他非字母字符了.
对于第二个难点,就是把电话号码(我已经处理成整数了)从小到大排序,然后统计输出.我在统计的时候在最后添加了一个哨兵(a[n]=-1),因为所有的电话号码都不会是-1.
使用qsort()的时间复杂度是O(NlgN).将电话号码处理成整数的空间复杂度是O(N).

点击(此处)折叠或打开

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

  4. const int maxn=100005;
  5. int a[maxn],map[128];
  6. int cmp(const void *a,const void *b)
  7. {
  8.     return *(int *)a-*(int *)b;
  9. }
  10. void init()
  11. {
  12.     memset(map,-1,sizeof(map));
  13.     map['A']=map['B']=map['C']=2;
  14.     map['D']=map['E']=map['F']=3;
  15.     map['G']=map['H']=map['I']=4;
  16.     map['J']=map['K']=map['L']=5;
  17.     map['M']=map['N']=map['O']=6;
  18.     map['P']=map['R']=map['S']=7;
  19.     map['T']=map['U']=map['V']=8;
  20.     map['W']=map['X']=map['Y']=9;
  21.     for(int i='0';i<='9';i++) map[i]=i-'0';
  22. }
  23. int trans(char s[])
  24. {
  25.     int ans=0,i;
  26.     for(i=0;s[i];i++) if(map[s[i]]!=-1)
  27.         ans=ans*10+map[s[i]];
  28.     return ans;
  29. }
  30. int main()
  31. {
  32.     int n,i,ans=0,p,cnt;
  33.     char s[125];
  34.     init();
  35.     scanf("%d",&n);
  36.     for(i=0;i<n;i++) 
  37.     {
  38.         scanf("%s",s);
  39.         a[i]=trans(s);
  40.     }
  41.     qsort(a,n,sizeof(a[0]),cmp);
  42.     a[n]=-1;
  43.     p=a[0]; cnt=1;
  44.     for(i=1;i<=n;i++) if(p==a[i])
  45.         cnt++;
  46.     else
  47.     {
  48.         if(cnt>1) { ans=1; printf("%03d-%04d %d\n",p/10000,p%10000,cnt); }
  49.         cnt=1;
  50.         p=a[i];
  51.     }
  52.     if(!ans) printf("No duplicates.\n");
  53.     return 0;
  54. }

POJ 2388 Who's in the Middle
题意:
给你N个(N一定为奇数)数,求这些数的中位数.
思路:
对N个数进行排序,A[N/2]就是中位数.

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int a[10004];
  4. int cmp(const void *a,const void *b)
  5. {
  6.     return *(int *)a-*(int *)b;
  7. }
  8. int main()
  9. {
  10.     int n,i;
  11.     scanf("%d",&n);
  12.     for(i=0;i<n;i++) scanf("%d",&a[i]);
  13.     qsort(a,n,sizeof(a[0]),cmp);
  14.     printf("%d\n",a[n/2]);
  15.     return 0;
  16. }

POJ 2390 Bank Interest
题意:
给出年利率R,本金M,年数Y,求Y年后本息和.
思路:
使用公式ans=M*(1+R/100)^Y.使用库函数pow().

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5.     int a,b,n;
  6.     while(scanf("%d%d%d",&a,&b,&n)!=EOF)
  7.     {
  8.         printf("%d\n",(int)(pow(1.0+a/100.0,n)*b));
  9.     }
  10.     return 0;
  11. }

POJ 1035 Spell Checker
题意:
给出一个字典包含若干单词,然后给你若干单词,让你判断该单词是否在字典中出现过,若出现过则该单词正确,若未出现过则查找字典中是否有单词可以通过删除/替换/插入一个字母而得到该单词.
思路:
主要就是对删除/替换/插入这三种操作的处理.详细参见代码.

点击(此处)折叠或打开

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

  4. const int maxn=10005;
  5. char dic[maxn][18],s[18];
  6. int v[maxn];
  7. int like(char s[],char t[])
  8. {
  9.     int x=strlen(s),y=strlen(t),i;
  10.     if(abs(x-y)>1) return 0;
  11.     if(x==y)
  12.     {
  13.         int cnt=0;
  14.         for(i=0;i<x;i++) if(s[i]!=t[i])
  15.         {
  16.             cnt++;
  17.             if(cnt>1) return 0;
  18.         }
  19.         return 1;
  20.     }
  21.     if(x-y==1)
  22.     {
  23.         i=0;
  24.         while(s[i]==t[i]) i++;
  25.         for(;i<y;i++) if(s[i+1]!=t[i]) return 0;
  26.         return 1;
  27.     }
  28.     i=0;
  29.     while(s[i]==t[i]) i++;
  30.     for(;i<x;i++) if(s[i]!=t[i+1]) return 0;
  31.     return 1;
  32. }
  33. int main()
  34. {
  35.     int cnt=0,i;
  36.     while(scanf("%s",dic[cnt]) && dic[cnt][0]!='#')
  37.         cnt++;
  38.     while(scanf("%s",s) && s[0]!='#')
  39.     {
  40.         int ans=0,f=0;
  41.         for(i=0;i<cnt;i++)
  42.         {
  43.             if(strcmp(s,dic[i])==0){ f=1; break;}
  44.             else if(like(s,dic[i])) v[ans++]=i;
  45.         }
  46.         if(f) printf("%s is correct\n",s);
  47.         else
  48.         {
  49.             printf("%s:",s);
  50.             for(i=0;i<ans;i++) printf(" %s",dic[v[i]]);
  51.             printf("\n");
  52.         }
  53.     }
  54.     return 0;
  55. }

UVA 488 Triangle Wave
题意:
输出一个波形,简单控制一下就行了.
思路:
主要就是注意一下最后一个的最后一行后面是没有空行的.

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int T,h,f,i,j,k;
  5.     scanf("%d",&T);
  6.     while(T--)
  7.     {
  8.         scanf("%d%d",&h,&f);
  9.         for(i=0;i<f;i++)
  10.         {
  11.             for(j=1;j<=h;j++,putchar('\n'))
  12.                 for(k=0;k<j;k++)
  13.                     printf("%d",j);
  14.             for(j=h-1;j>0;j--,putchar('\n'))
  15.                 for(k=0;k<j;k++)
  16.                     printf("%d",j);
  17.             if(!(T==0 && i==f-1))
  18.                 putchar('\n');
  19.         }
  20.     }
  21.     return 0;
  22. }

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