pku1029-False coin

本文介绍了一个用于确定一组硬币中哪一个是假币的算法。该算法通过多次称重比较硬币重量,并根据称重结果缩小可疑硬币范围,最终找出假币。涉及核心数据结构与算法实现。

pku1029-False coin


题意:一堆硬币(N个) 中有一个假币,假币质量与其他硬币质量不同(更重或更轻),通过K次称重得到的结果来判断假币的序号。


首先给出两个整数 N 和 K ,表示有N个硬币,K次称重。

然后2K行

每两行代表一次称重。



1. =

等号两边的硬币都是正常硬币


2.<或>

同时处于偏重和偏轻端的硬币正常。


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int main()
{
	int n,k,p,i,j,mark;
	int flag[1001],t1[501],t2[501],temp[1001];
	bool less[1001],more[1001];
	char ch[10];
	while(scanf("%d%d",&n,&k)!=EOF)
	{
		memset(flag,-1,sizeof(flag));
		memset(less,0,sizeof(less));
		memset(more,0,sizeof(more));
		
		for(i=1;i<=k;i++)
		{
			scanf("%d",&p);
			for(j=1;j<=p;j++)	scanf("%d",&t1[j]);
			for(j=1;j<=p;j++)	scanf("%d",&t2[j]);
			scanf("%s",ch);
			if(ch[0]=='=')	for(j=1;j<=p;j++)	flag[t1[j]]=0,flag[t2[j]]=0;
			else
			{
				memset(temp,0,sizeof(temp));
				for(j=1;j<=p;j++)				//出现在不等式的数字都有嫌疑,所以令temp==0的i正常
				{
					temp[t1[j]]=1;
					temp[t2[j]]=1;
				}
				if(ch[0]=='>')
				{
					for(j=1;j<=p;j++)	more[t1[j]]=1;
					for(j=1;j<=p;j++)	less[t2[j]]=1;
				}
				else
				{
					for(j=1;j<=p;j++)	less[t1[j]]=1;
					for(j=1;j<=p;j++)	more[t2[j]]=1;
				}
				for(j=1;j<=n;j++)
				{
					if(!temp[j])	flag[j]=0;
					if(more[j]&&less[j])	flag[j]=0;
				}
			}
		}
	//	for(i=1;i<=n;i++)
	//		printf("%d ",less[i]);printf("\n");
	//	for(i=1;i<=n;i++)
	//		printf("%d ",more[i]);printf("\n");
	//	for(i=1;i<=n;i++)
	//		printf("%d ",flag[i]);printf("\n");
		for(mark=0,i=1;i<=n;i++)
			if(flag[i]==-1)
			{
				if(mark!=0)
				{
					mark=0;
					break;
				}
				else
					mark=i;
			}
		
		printf("%d\n",mark);
	}
	return 0;
}


评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值