首页 > 代码库 > poj1029(找假硬币)模拟
poj1029(找假硬币)模拟
题意:给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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。