题目
有N个硬币,其中有一个假的(重量和别的不同),给出一些用天平测试的结果,判断哪个硬币是假的。
分析
枚举。每个硬币各枚举两次(比其他轻,比其他重,这里可以通过给其他硬币赋值+1,或-1,有问题的为0解决)。
说明
继续看论文。。。ε=(´ο`*)))唉
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int coins[101];
int P[101];
int pan[101][101];
char state[101];
int weight(int a[], int n, int false_id, int value)
{
int sum = 0;
for (int i = 1; i <= n; ++ i) {
if (a[i] != false_id) {
sum += value;
}
}
return sum;
}
int judge(int N, int K, int value)
{
int count = 0;
for (int t = 1; t <= N; ++ t) {
int ans = 0;
for (int i = 1; i <= K; ++ i) {
int sum_L = weight(pan[i], P[i], t, value);
int sum_R = weight(pan[i]+P[i], P[i], t, value);
if (sum_L < sum_R && state[i] != '<') {
ans = -1;
break;
} else if (sum_L > sum_R && state[i] != '>') {
ans = -1;
break;
} else if (sum_L == sum_R && state[i] != '=') {
ans = -1;
break;
}
}
if (!ans && !coins[t]) {
coins[t] = 1;
count ++;
}
}
return count;
}
int main()
{
int M, N, K;
while (~scanf("%d", &M))
while (M --) {
scanf("%d%d", &N, &K);
for (int i = 1; i <= N; ++ i) {
coins[i] = 0;
}
for (int i = 1; i <= K; ++ i) {
scanf("%d", &P[i]);
for (int j = 1; j <= 2*P[i]; ++ j) {
scanf("%d", &pan[i][j]);
}
getchar();
scanf("%c", &state[i]);
}
int size = judge(N, K, +1) + judge(N, K, -1);
if (size != 1) {
printf("0\n");
} else {
for (int i = 1; i <= N; ++ i) {
if (coins[i]) {
printf("%d\n", i);
break;
}
}
}
if (M) {
puts("");
}
}
return 0;
}