CODEFORCES problem 105A.Transmigration

  题目本身上手并不难,字符串处理+简单的排序。要注意的地方是浮点数的处理。

  依据计算机中浮点数的表示原理,在实际编程的过程中即使用一个确定的整数(假设是1)给一个浮点变量赋值 在查看变量时会发现实际存储的值是0.99999…….可以注意到在使用原来的EPX*k时也有可能出现这样的情况,本来是准确值应该是100,浮点运算却会得到 99.999……

 

由于k只有两位小数,因此一个整数乘上k,最多还是只有两位

我们令

      新的经验new_epx=epx*k+0.001

当然可以用任何比0.01小的数,都能在不会影响正确结果的前提下修正错误结果。

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 char f[100][100];
 5 int  c[100];
 6 int main()
 7 {
 8     int n,m;
 9     double k;
10     char s[30];
11     int x,t=0,i,j,flag;
12     scanf("%d %d %lf",&n,&m,&k);
13     for(i=1;i<=n;i++)
14     {
15         scanf("%s %d",s,&x);
16         if(x*k+0.001>=100)
17         {
18            t++;
19            strcpy(f[t],s);c[t]=floor(x*k+0.001);
20         }
21     }
22     for(i=1;i<=m;i++)
23     {
24         scanf("%s",s);
25         for(j=1,flag=0;j<=t;j++)
26            if(strcmp(s,f[j])==0){flag=1;break;}
27         if(!flag)
28         {
29             t++;
30             strcpy(f[t],s);
31         }
32     }
33     char ss[30];
34     int xx;
35     for(i=1;i<=t;i++)
36         for(j=i+1;j<=t;j++)
37         {
38             if(strcmp(f[i],f[j])>0)
39             {
40                 strcpy(ss,f[i]);
41                 strcpy(f[i],f[j]);
42                 strcpy(f[j],ss);
43                 xx=c[i];c[i]=c[j];c[j]=xx;
44             }
45         }
46     printf("%d\n",t);
47     for(i=1;i<=t;i++)
48         printf("%s %d\n",f[i],c[i]);
49     return 0;
50 }

 

 

 

posted @ 2013-11-05 22:10  keambar  阅读(365)  评论(0编辑  收藏  举报