Counterfeit Dollar 1013 pku

本文介绍了一种解决12枚硬币中寻找唯一假币问题的算法实现,通过三次称重判断假币及其轻重,并附带源代码。采用枚举及剪枝策略提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description:

http://acm.pku.edu.cn/JudgeOnline/problem?id=1013

有12枚硬币,11枚硬币是正常的,1枚是假的,可能轻也可能重,Sally通过三次称能够找出假的而且能够找出其轻重

通过枚举每一枚的轻重看其是否符合,可以通过even剪枝一些情况

Solution:

1 #include <stdio.h>
2 #include <string.h>
3
4  #define CHARSIZE 16
5
6 char left[4][CHARSIZE],right[4][CHARSIZE],type[4][CHARSIZE];
7
8 int Check(int p,int flag)
9 {
10 int i=0,j=0,leftSum=0,rightSum=0;
11 for (i=0; i<3; i++)
12 {
13 leftSum=0;
14 rightSum=0;
15 for (j=0;left[i][j]&&right[i][j];j++)
16 {
17 if (p+'A' == left[i][j])
18 leftSum += flag;
19 else
20 leftSum += 2;
21
22 if (p+'A' == right[i][j])
23 rightSum += flag;
24 else
25 rightSum += 2;
26 }
27 if (leftSum == rightSum && strcmp(type[i],"even"))
28 return 0;
29 if (leftSum < rightSum && strcmp(type[i],"down"))
30 return 0;
31 if (leftSum > rightSum && strcmp(type[i],"up"))
32 return 0;
33 }
34
35 return 1;
36 }
37
38 int main ()
39 {
40 const int len=12;
41 int testcase=0,i=0,j=0;
42 int mark[len];
43
44 scanf ("%d",&testcase);
45
46 while (testcase--)
47 {
48 memset((void*)mark,0,sizeof(mark));
49 for (i=0; i<3; i++)
50 {
51 scanf ("%s %s %s",left[i],right[i],type[i]);
52 if (strcmp(type[i],"even")==0)
53 {
54 for (j=0; left[i][j]&&right[i][j]; j++)
55 {
56 mark[left[i][j]-'A'] = 2;
57 mark[right[i][j]-'A'] = 2;
58 }
59 }
60 }
61
62 for (i=0; i<len; i++)
63 {
64 if (mark[i] == 2)
65 continue;
66
67 mark[i] = 1;
68 if (Check(i,1))
69 {
70 printf ("%c is the counterfeit coin and it is light.\n",i+'A');
71 break;
72 }
73 if (Check(i,3))
74 {
75 printf ("%c is the counterfeit coin and it is heavy.\n",i+'A');
76 break;
77 }
78 }
79 }
80
81 return 0;
82 }

 

转载于:https://www.cnblogs.com/eavn/archive/2010/06/07/1753050.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值