poj1029

来源:互联网 发布:古墓丽影崛起优化 编辑:程序博客网 时间:2024/05/16 10:10

题目不难,主要是思路要清晰。大致题意为:给定n个硬币(编号从1到n),给定k个天平比较状态和结果。已知n个硬币中有且仅有一个硬币重量有问题,其余的都相同。先要求根据这k个天平比较状态判断出哪个硬币有问题。若可以判断出来则输出该硬币编号,否则输出0。

分析思路:可以使用穷举法。穷举1——n个硬币,分别判断是否是有问题的硬币(即假设该硬币有问题,是否与已知的天平判断结果一致),当然试探要分两种情况:重量轻了、重量重了。若全部试探完后发现:若个数为1,则说明有问题的硬币就是该硬币;否则说明有问题的硬币可能超过2个,则说明不能判断到底硬币是哪个。

主题思路清晰后,接下来就是如何判定是否与天平测试结果相一致。其实非常简单:

1)若为轻的情况。

  11) <  ,则该硬币必定在天平左边

  12) =  ,则该硬币比定既不在左边又不在右边

  13) >  ,则该硬币必定在天平右边

2)若为重的情况,稍微改动一下1)就可。

下面是代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>#define Max 1010#define Maxx 110struct Node{ //记录天平状态和结果的结构体int num;int left[Max/2];int right[Max/2];char result;}node[Maxx]; int n,m; //硬币个数、天平测量数int point,rpoint; //记录假设重量有问题的硬币,记录重量有问题的硬币(结果)bool Is_good(struct Node fnode,bool weight){ //判段是否与天平测量结果一致switch(fnode.result){case '<': //小于if(!weight){ // 轻for(int i=1;i<=fnode.num;i++)if(fnode.left[i]==point)return true;return false;}else{ //重for(int i=1;i<=fnode.num;i++)if(fnode.right[i]==point)return true;return false;}break;case '=': //等于for(int i=1;i<=fnode.num;i++)if(fnode.left[i]==point || fnode.right[i]==point)return false;return true;break;case '>': //大于if(!weight){ //轻for(int i=1;i<=fnode.num;i++)if(fnode.right[i]==point)return true;return false;}else{  //重for(int i=1;i<=fnode.num;i++)if(fnode.left[i]==point)return true;return false;}break;}}int main(){scanf("%d%d",&n,&m);int pivot=1;for(int i=1;i<=m;i++){ //输入天平测试状态和结果scanf("%d",&node[pivot].num);for(int j=1;j<=node[pivot].num;j++)scanf("%d",&node[pivot].left[j]);for(int j=1;j<=node[pivot].num;j++)scanf("%d",&node[pivot].right[j]);getchar();node[pivot++].result=getchar();}int wrong=0; //初始化有问题的硬币个数为0for(int i=1;i<=n;i++){ //枚举判断有问题的硬币个数bool trag=true;point=i;for(int j=1;j<pivot;j++){ //测试为轻情况if(!Is_good(node[j],false)){ trag=false;  break;}}if(trag){wrong++;if(wrong>1){ //若个数大于1,则说明无法判断printf("0\n");return 0;}rpoint=i;}else{  // 若不满足轻情况,则测试为重的情况trag=true;for(int j=1;j<pivot;j++){ //测试为重的情况if(!Is_good(node[j],true)){trag=false;break;}}if(trag){wrong++;if(wrong>1){ //若个数大于1,则说明无法判断printf("0\n");return 0;}rpoint=i;}}}    if(wrong==0) //可去掉,因为个数必定大于等于1printf("0\n");elseprintf("%d\n",rpoint);    return 0;}


 

0 0
原创粉丝点击