poj 1029

来源:互联网 发布:孤岛惊魂3低配优化 编辑:程序博客网 时间:2024/04/24 03:28

题意:找出那个和其他所有硬币重量不一样的硬币。具体信息看题目。

具体的思路如下:

1.等式两边出现的硬币不可能为假。

2不等式的轻端和重端都出现的硬币,不可能为假。

3轻端和重端出现次数不足k次的,也不可能为假(k是不等式的个数)

排除掉上述三种情况,只剩下一枚硬币没确定,那就是这枚硬币。其他情况就输出0.

代码如下:

import java.util.Scanner;public class Main {public static final int MAX = 1005;public static void main(String[] args){Scanner cin = new Scanner(System.in);int [] equal = new int[MAX];int [] t = new int[MAX];int [] d = new int[MAX];int n,k,p,sum,total,num;char s;total = 0;num = 0;n = cin.nextInt();k = cin.nextInt();for(int i=1; i<=n; i++){equal[i] = 0;t[i] = 0;}while((k--)!=0){p = cin.nextInt();for(int j=0; j<2*p; j++){d[j] = cin.nextInt();}s = cin.next().charAt(0);if(s=='='){  for(int i=0; i<2*p; i++){equal[d[i]] = 1; //记录出现在等式中硬币的标号}}else if(s=='<'){++total;              //记录不平衡的次数 也就是不等式的次数for(int i=0; i<p; i++){--t[d[i]];    //对相应的硬币在不等式中出现的次数进行计数}for(int i=p; i<2*p; i++){++t[d[i]];}}else{++total; for(int i=0; i<p; i++){++t[d[i]];}for(int i=p; i<2*p; i++){--t[d[i]];}}}                //不等式表示,特殊的硬币一定在其中了//不管特殊硬币是轻还是重,用一个条件判断一下就行了sum = 0;for(int i=1; i<=n; i++){if(equal[i]==1){continue;}if(t[i] == total || t[i] == -total){//如果特殊的硬币是重或者轻的情况++sum;  //代表特殊硬币的个数num=i;  //记住相应的标号}}if(sum==1){System.out.println(num);}else{System.out.println("0");}}}