题意:找出那个和其他所有硬币重量不一样的硬币。具体信息看题目。
具体的思路如下:
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");
}
}
}