标签: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