版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/arthu6/article/details/85319560
问题定义:已知N枚硬币质量,其中有一枚假币(或轻或重),请找出假币
思路:
- 若N<3,无法判断
- 若范围缩小至一枚硬币,拿一枚真币比较轻重
- 若范围缩小至两枚硬币,拿一枚真币与其中一枚比较轻重,缩小范围至一枚硬币
- 若范围在三枚以上,将硬币三分,左边num/3枚,右边num/3枚,其余放中间(num为范围大小)。
4.1若左边硬币质量等于右边,缩小范围到中间
4.2若左边硬币质量等于num/3枚真币的质量,缩小范围到右边
4.2.1 若不等于,假币范围在左边
代码加注释:
#include<iostream>
#include<cstdlib>
using namespace std;
#define N 1005
void Judge(int *a,int n,int p,int q)
{
if(n<3)
{
cout<<"无法判断"<<endl;
return ;
}
if(p==q)//范围缩小到一枚硬币
{
if(p>0)
{
if(a[p]>a[0])
{
cout<<"假币序号为"<<p+1<<",假币重量为"<<a[p]<<",且假币较重!"<<endl;
}
else
cout<<"假币序号为"<<p+1<<",假币重量为"<<a[p]<<",且假币较轻!"<<endl;
}
else
{
if(a[p]>a[n-1])
{
cout<<"假币序号为"<<p+1<<",假币重量为"<<a[p]<<",且假币较重!"<<endl;
}
else
cout<<"假币序号为"<<p+1<<",假币重量为"<<a[p]<<",且假币较轻!"<<endl;
}
}
else if(q-p==1)//范围缩小到两枚硬币
{
if(p>0)
{
if(a[p]==a[0]) Judge(a,n,p+1,q);
else Judge(a,n,p,q-1);
}
else if(q<n-1)
{
if(a[p]==a[n-1]) Judge(a,n,p+1,q);
else Judge(a,n,p,q-1);
}
}
else if(p<q)//范围在三枚硬币以上
{
int temp=(q-p+1)/3;
int sum1=0,sum2=0;
for(int i=0;i<temp;i++)
{
sum1+=a[p+i];
sum2+=a[q-i];
}
if(sum1==sum2)
{
Judge(a,n,p+temp,q-temp);
}
else
{
if(sum1==a[p+temp]*temp)
{
Judge(a,n,q-temp+1,q);
}
else
{
Judge(a,n,p,p+temp-1);
}
}
}
}
int main()
{
int a[N],n;
cout<<"请输入硬币枚数:";
cin>>n;
cout<<"请输入硬币质量:";
for(int i=0;i<n;i++)
cin>>a[i];
Judge(a,n,0,n-1);
return 0;
}
截图: