枚举算法:假币问题
下面的输出案例:
K is the counterfeit coin and it is light.
c语言代码实现:
include<stdio.h>
int status[12];
char left[3][7],right[3][7],result[3][7];
int balance(void)
{
int i,k,leftW,rightW;
for(i=0; i<3; i++)
{
leftW=rightW=0;
for(k=0; k<6&&left[i][k]!=0; k++)
{
leftW+=status[left[i][k]-'A']; //利用ASCII码值来判断是数组中的第几个数,即第几枚硬币,并求和来代表硬币的总重量
rightW+=status[right[i][k]-'A']; //同上
}
if(leftW>rightW&&result[i][0]!='u') //这三个if只要有一个满足,就是和给的情况矛盾,也就是不符合假设,所以返回值0,if函数不满足
return 0;
if(leftW==rightW&&result[i][0]!='e')
return 0;
if(leftW<rightW&&result[i][0]!='d')
return 0;
}
return 1;
}
int main(void)
{
int i,num;
scanf("%d",&num); //测试组数
while(num-->0) //根据测试组数确定循环几次
{
for(i=0; i<3; i++) //每组三次输入
{
scanf("%s%s%s",left[i],right[i],result[i]); //数组名直接就是地址,进行传值
}
for(i=0; i<12; i++)
{
status[i]=0; //12枚硬币全部设为零,表示正常
}
for(i=0; i<12; i++)
{
status[i]=1; //第i枚硬币是假币,且偏重
if(balance())
break;
status[i]=-1;
if(balance())
break;
status[i]=0;
}
}
printf("%c is the counterfeit coin and it is %s.\n ",i+'A',status[i]>0?"heavy":"light");
return 0;
}
分析:
1.一个烧脑的要死的程序!!!!!枚举法的典型示例,核心思想在于将所有情况全部枚举出来,与实际情况一一对比,不满足的舍弃,留下满足的就是正确结果
2.本题难点在于如何将所有情况一一枚举出来并且用恰当的方式来筛选,代码中的balance函数值得学习
3.这类的题难点在于如何将问题架构出来,并给出合理的解决方法,不要拿到题就埋头做,思考比做题的过程更重要
结束!!!!
浙公网安备 33010602011771号