标签:style blog class code c int
题意:给n个硬币,其中有一个硬币和其他的硬币重量不一样,给出k次比较重量的结果。问是否可以将假硬币找出来。
解法:判断一个硬币是真币的方法(满足其一):
1、这个硬币出现过在=的两边
2、既出现在小于的一边过,也出现在大于的一边过。
如果排除这些硬币后只剩下一个,那么假币就是剩下的那个,否则就是不确定。
代码:
/****************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
using namespace std;
#define eps 1e-8
typedef long long LL;
int n,k;
int num[1010];
int rem[1010];
vector<int> vec1;
vector<int> vec2;
int main()
{
while(scanf("%d%d",&n,&k)==2)
{
memset(num,0,sizeof num);
memset(rem,0,sizeof rem);
int sum=0;
int ans=0;
for(int i=0; i<k; i++)
{
int m;
vec1.clear();
vec2.clear();
scanf("%d",&m);
for(int i=0; i<m; i++)
{
int a;
scanf("%d",&a);
vec1.push_back(a);
}
for(int i=0; i<m; i++)
{
int a;
scanf("%d",&a);
vec2.push_back(a);
}
char c;
cin>>c;
if(c==‘<‘)
{
sum++;
for(int i=0; i<m; i++)
{
num[vec1[i]]++;
num[vec2[i]]++;
if(rem[vec1[i]]==1)
rem[vec1[i]]=2;
else if(rem[vec1[i]]!=2)
rem[vec1[i]]=-1;
if(rem[vec2[i]]==-1)
rem[vec2[i]]=2;
else if(rem[vec2[i]]!=2)
rem[vec2[i]]=1;
}
}
else if(c==‘>‘)
{
sum++;
for(int i=0; i<m; i++)
{
num[vec1[i]]++;
num[vec2[i]]++;
if(rem[vec1[i]]==-1)
rem[vec1[i]]=2;
else if(rem[vec1[i]]!=2)
rem[vec1[i]]=1;
if(rem[vec2[i]]==1)
rem[vec2[i]]=2;
else if(rem[vec2[i]]!=2)
rem[vec2[i]]=-1;
}
}
else
{
for(int i=0; i<m; i++)
{
rem[vec1[i]]=2;
rem[vec2[i]]=2;
}
}
}
for(int i=1; i<=n; i++)
{
if(rem[i]!=2&&(((num[i]==sum)&&(sum!=0))||sum==0))
{
if(ans==0)
ans=i;
else
{
ans=0;
break;
}
}
}
cout<<ans<<endl;
}
return 0;
}
poj1029(找假硬币)模拟,布布扣,bubuko.com
标签:style blog class code c int
原文地址:http://blog.csdn.net/xiefubao/article/details/24991257