posts - 99,  comments - 8,  trackbacks - 0
其实这道题只要找到了解题的切入口是很简单的 :出现不等号必然是由假币引起的,所以假币在不等式两边出现的次数必然等于所输入的不等号的数。  通过tag 数组记录硬币是否在等号两边出现过,这样的被标记为1,遍历时跳过,没有被标记为 1 的可能是假币,再看数组num中记录的i硬币在不等式出现的次数是否等于不等号的次数

 1#include <stdio.h>
 2#include <stdlib.h>
 3#define MAX 1001
 4#define OK 1
 5
 6int tag[MAX];  //将出现了等号的(即真币)排除    标记为1   遍历时跳过 
 7int num[MAX];  //记录下标为i的硬币在不等式的两边出现的次数 
 8
 9int main ()
10{
11    
12    int coin[MAX];   //访问时下标的中介 
13    int N, k, pi, count ;
14    char c;
15    
16    while ( scanf ("%d%d"&N, &k) != EOF )
17    {
18          count = 0;   //记录接下来的 k 次称量中有多少次出现了不等号 
19          
20          for ( int i = 0; i < k; i ++)  // k 次的称量记录 
21          {
22              scanf ("%d"&pi);
23              for (int j = 0; j < 2 * pi; j ++)
24              {
25                  scanf ("%d"&coin[j]);
26              }

27              
28              getchar ();
29              
30              c = getchar ();
31              
32              for (int i = 0; i < 2 * pi; i ++)
33              {
34                  if (c == '=')
35                  tag[coin[i]] = 1;
36                  
37                  else if (c == '<')
38                  {
39                       count ++;
40                       for (int j = 0; j < pi; j ++)
41                       
42                           num[coin[j]]--;
43                       }

44                       for (int j = pi; j < 2 * pi; j++)
45                       {
46                           num[coin[j]]++;
47                       }

48                  }

49                  
50                  else
51                  {
52                      count ++;
53                       for (int j = 0; j < pi; j ++)
54                       {
55                           num[coin[j]]++;
56                       }

57                       for (int j = pi; j < 2 * pi; j++)
58                       {
59                           num[coin[j]]--;
60                       }

61                  }

62              }

63             
64          }

65          
66          int mark = 0;
67          int temp ;
68          for (int i = 1; i <= N; i ++)
69          {
70              if (tag[i] == 1)  //表示为真币,不可能 
71              continue;
72              
73              if (num[i] == count || num[i] == -count)   //如果硬币在不等式的两边出现的次数等于不等号数为假币 
74              {
75                         mark ++;
76                         temp = i;
77              }

78          }

79          
80          if (mark == 1)    // 假币只有一个 
81          {
82             printf ("%d\n", temp);
83          }

84          
85          else 
86          printf ("%d\n",0);
87            
88    }

89    
90    return 0;
91}

92
posted on 2010-08-09 13:06 雪黛依梦 阅读(258) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜