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
- poj1029
- poj1029
- POJ1029
- poj1029
- POJ1029
- POJ1029
- poj1029
- poj1029
- poj1029 模拟
- 【模拟】Poj1029 False Coin
- poj1029 False coin
- poj1029 2010.4.14
- poj1029 模拟/枚举
- poj1029(找假硬币)模拟
- POJ1029 & POJ1013 - 找哪个是假硬币...思维
- 2011.12.22 poj1029 暴力枚举【learn from others】
- ***POJ1029 False coin ACM解题报告(贪心难题)
- Vulnerability Assessment of SNMP Service – III
- 程序缓冲区
- iBatis入门教程
- XMPP
- Android 中的 Service 全面总结
- poj1029
- ARM学习笔记&思考_20140810
- Oracle中rowid与rownum的使用
- C++中指针
- 手把手教你把Vim改装成一个IDE编程环境(图文)
- 骡 子 的 哲 学 (转 载)
- Orange's 自己动手写操作系统 第一章 十分钟完成的操作系统 U盘启动 全记录
- 自己的学习总结
- MVC学习——M/V/C分工模式