POJ 1029 -- False coin

题目:http://poj.org/problem?id=1029

题意:

  给你N个硬币,其中只有一个是假的(或轻或重),给你K次测量结果,让你找出那个加硬币。

思路:

  1.首先我们可以每个硬币一个标记flag,初始值为-2,如果它是真的话,则赋值为0,轻为-1,重为1。

  2.对每次的测量结果,我们做如下处理:

    (1)如果不是‘=’,则假硬币必在其中,我们可将剩余的硬币flag置为0;天平上轻的一端,如果flag=0,则不管,

      flag=1,则将其置为0,flag=-1,则无法判断;天平重的一端,如果flag=0,不管,如果flag=-1,则将其置为

      0,flag=1,则无法判断,不管。

    (2)如果是‘=’,则将天平上所有硬币的flag置为0.

  3.最后check每个硬币的flag,分别记录flag=0的硬币个数count,和flag!=0硬币编号bj;如果count=N-1,则输出bj,

   不然输出0.

AC代码如下:

  1 #include<cstdio>
2 #include<iostream>
3 using namespace std;
4 int temp[1005],flag[1005];
5 struct Coin
6 {
7 int flag;
8 int vis;
9 }coin[1005];
10 int main()
11 {
12 int N,K,i,j,num,bj,count;
13 char s[2];
14 scanf("%d %d",&N,&K);
15 for(i=1;i<=N;i++)
16 coin[i].flag=-2;
17 while(K--)
18 {
19 for(i=1;i<=N;i++)
20 coin[i].vis=0;
21 scanf("%d",&num);
22 for(i=1;i<=2*num;i++)
23 {
24 scanf("%d",&temp[i]);
25 coin[temp[i]].vis=1;
26 }
27 scanf("%s",&s);
28 switch(s[0])
29 {
30 case '=':for(i=1;i<=2*num;i++)
31 coin[temp[i]].flag=0;
32 break;
33 case '<':for(i=1;i<=num;i++)
34 {
35 if(coin[temp[i]].flag==0)
36 continue;
37 else if(coin[temp[i]].flag==1)
38 {
39 coin[temp[i]].flag=0;
40 continue;
41 }
42 else
43 {
44 coin[temp[i]].flag=-1;
45 continue;
46 }
47 }
48 for(i=num+1;i<=2*num;i++)
49 {
50 if(coin[temp[i]].flag==0)
51 continue;
52 else if(coin[temp[i]].flag==-1)
53 {
54 coin[temp[i]].flag=0;
55 continue;
56 }
57 else
58 {
59 coin[temp[i]].flag=1;
60 continue;
61 }
62 }
63 for(i=1;i<=N;i++)
64 if(coin[i].vis==0)
65 coin[i].flag=0;
66 break;
67 case '>':for(i=1;i<=num;i++)
68 {
69 if(coin[temp[i]].flag==0)
70 continue;
71 else if(coin[temp[i]].flag==-1)
72 {
73 coin[temp[i]].flag=0;
74 continue;
75 }
76 else
77 {
78 coin[temp[i]].flag=1;
79 continue;
80 }
81 }
82 for(i=num+1;i<=2*num;i++)
83 {
84 if(coin[temp[i]].flag==0)
85 continue;
86 else if(coin[temp[i]].flag==1)
87 {
88 coin[temp[i]].flag=0;
89 continue;
90 }
91 else
92 {
93 coin[temp[i]].flag=-1;
94 continue;
95 }
96 }
97 for(i=1;i<=N;i++)
98 if(coin[i].vis==0)
99 coin[i].flag=0;
100 break;
101 }//switch
102
103 }//while
104 count=0;
105 for(i=1;i<=N;i++)
106 {
107 if(coin[i].flag==0)
108 count++;
109 else
110 bj=i;
111 }
112 printf("%d\n",count==N-1?bj:0);
113 return 0;
114 }


posted @ 2012-02-18 11:18  Chnwy  阅读(460)  评论(0编辑  收藏  举报