/*
八枚银币
在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。
检测出假硬币所在位置以及该硬币是轻还是重
输入:
第一行输入八枚硬币的重量,分别用空格隔开
输出:
第二行输出假币在这八枚硬币中的位置
第三行输出假币偏重or偏轻
样例输入:
6 6 6 6 6 9 6 6 6 6
样例输出:
6
heavier
问题分析:
八枚硬币(a,b,c,d,e,f,g,h)
因为八枚硬币中 有1枚硬币与其他7枚不同。
故可将八枚分为三组:
1、 a,b,c
2、 d,e,f
3、 g,h
过程( 可以通过一架天平来任意比较两组硬币 );
i、判断(a,b,c)与(d,e,f)的重量
(1) (a,b,c) == (d,e,f) * 即假币必定为 g or h *
先判断if( g > h ),再判断g(or h)是否等于(a,b,c,d,e,f)中的一个:
若是 则h(or g)为假币,并输出结果 lighter.
若否 则h(or g)为假币,并输出结果 heavier.
(2) (a,b,c) > (d,e,f) * 即假币必定为 a or b or c or d or e or f *
重新分组为 (a,e) (b,d) (c,f): 交换 b,e 的位置可判断出 (a,d) 为假 or (b,e)为假.
判断if( a+e > d+b ) 符号仍为 > :说明 假币必为(a,d)中的一枚
if( a+e == d+b ) 说明 假币必为(c,f)中的一枚
if( a+e < d+b ) 符号改变 : 说明 假币必为(b,e)中的一枚
(3) (a,b,c) < (d,e,f) * 即假币必定为 a or b or c or d or e or f *
判断if( a+e < d+b ) 符号仍为 < :说明 假币必为(a,d)中的一枚
if( a+e == d+b ) 说明 假币必为(c,f)中的一枚
if( a+e > d+b ) 符号改变 : 说明 假币必为(b,e)中的一枚
ii、由此,声明3个函数分别处理
①EightCoins 用于区分可能的假币组(elem1,elem2)
②Compare 用于区分出假币(sham)
③Print 用于打印结果
iii、代码实现如下...
*/
#include <iostream>
using namespace std;
void EightCoins(int* arr); // 判断真假
void Print(int sham,int real,int index); // 输出
void Compare(int elem1,int elem2,int real,int index1,int index2); // 判断轻重
int main()
{
int i;
int arr[8];
for( i=0; i<8; i++ )
cin>>arr[i];
EightCoins(arr);
return 0;
}
// 判断轻重
void EightCoins(int* arr)
{
int a = arr[0],
b = arr[1],
c = arr[2],
d = arr[3],
e = arr[4],
f = arr[5],
g = arr[6],
h = arr[7];
int abc = a+b+c,
def = d+e+f;
if(abc > def)
{
if( (a+e) > (d+b) ) // 去除c,f 并 互换b,e的位置 仍然 > 说明a,d中必有一枚为假币
Compare(a,d,g,0,3);
else if( (a+e) == (d+b) ) // 去除c,f (a+b) == (d+e) 说明c,f中必有一枚为假币
Compare(c,f,g,2,5);
else // 去除c,f 并 互换b,e的位置 符号改变 说明b,e中必有一枚假币
Compare(b,e,g,1,4);
}
else if(abc == def)
Compare(g,h,a,6,7); // 最好的情况
else
{
if( (a+e) < (d+b) ) // 去除c,f 并 互换b,e的位置 仍然 > 说明a,d中必有一枚为假币
Compare(a,d,g,0,3);
else if( (a+e) == (d+b) ) // 去除c,f (a+b) == (d+e) 说明c,f中必有一枚为假币
Compare(c,f,g,2,5);
else // 去除c,f 并 互换b,e的位置 符号改变 说明b,e中必有一枚假币
Compare(b,e,g,1,4);
}
}
// 比较真假
void Compare(int elem1,int elem2,int real,int index1,int index2)
{
if(elem1 == real)
Print(elem2,real,index2);
else
Print(elem1,real,index1);
}
// 输出
void Print(int sham,int real,int index)
{
if(sham > real)
cout<<index+1<<endl<<"heavier"<<endl;
else
cout<<index+1<<endl<<"lighter"<<endl;
}
时间: 2024-10-14 17:08:24