//684K 0MS G++
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstring>
using namespace std;
char coins[12];
// char weightingRes[3][30];
char weightingRes[30];
char leftPart[10];
char rightPart[10];
char res[10];
int weighttingInfo[3][20]; // 0: even 1: light
char lightWeighttingNum;
int weightSideNum;
void fillInfo(char * leftPart, char * rightPart, char * res) {
// printf("%s\n", info);
char flag = 0;
// printf("%s %s %s\n", leftPart, rightPart, res);
if (!strcmp("up", res)) {
flag = 1;
char inSideFlag[12] = {0};
for (int i = 0; i < strlen(leftPart); i++) {
if (coins[leftPart[i] - 'A'] != 3) {
if (coins[leftPart[i] - 'A'] == -flag) {
coins[leftPart[i] - 'A'] = 3;
} else {
coins[leftPart[i] - 'A'] = flag;
}
}
inSideFlag[leftPart[i] - 'A'] = 1;
}
flag = -1;
for (int i = 0; i < strlen(rightPart); i++) {
if (coins[rightPart[i] - 'A'] != 3) {
if (coins[rightPart[i] - 'A'] == -flag) {
coins[rightPart[i] - 'A'] = 3;
} else {
coins[rightPart[i] - 'A'] = flag;
}
}
inSideFlag[rightPart[i] - 'A'] = 1;
}
for (int i = 0; i < 12; i++) {
if (!inSideFlag[i]) {
coins[i] = 3;
}
}
} else if (!strcmp("down", res)) {
flag = -1;
char inSideFlag[12] = {0};
for (int i = 0; i < strlen(leftPart); i++) {
if (coins[leftPart[i] - 'A'] != 3) {
if (coins[leftPart[i] - 'A'] == -flag) {
coins[leftPart[i] - 'A'] = 3;
} else {
coins[leftPart[i] - 'A'] = flag;
}
}
inSideFlag[leftPart[i] - 'A'] = 1;
}
flag = 1;
for (int i = 0; i < strlen(rightPart); i++) {
if (coins[rightPart[i] - 'A'] != 3) {
if (coins[rightPart[i] - 'A'] == -flag) {
coins[rightPart[i] - 'A'] = 3;
} else {
coins[rightPart[i] - 'A'] = flag;
}
}
inSideFlag[rightPart[i] - 'A'] = 1;
}
for (int i = 0; i < 12; i++) {
if (!inSideFlag[i]) {
coins[i] = 3;
}
}
} else {
flag = 3;
for (int i = 0; i < strlen(leftPart); i++) {
coins[leftPart[i] - 'A'] = 3;
}
for (int i = 0; i < strlen(rightPart); i++) {
coins[rightPart[i] - 'A'] = 3;
}
}
}
void solve() {
// printf("solve\n");
for (int i = 0; i < 12; i++) {
if (coins[i] == -1) {
printf("%c is the counterfeit coin and it is light. \n", i+'A');
return;
} else if (coins[i] == 1) {
printf("%c is the counterfeit coin and it is heavy. \n", i+'A');
return;
}
}
}
int caseNum;
int main() {
scanf("%d\n", &caseNum);
for (int i = 1; i <= caseNum; i++) {
memset(weighttingInfo, 0, sizeof(weighttingInfo));
memset(coins, 0, sizeof(coins));
lightWeighttingNum = 0;
for (int i = 0; i <= 2; i++) {
// fgets(weightingRes, sizeof(weightingRes), stdin);
scanf("%s%s%s", leftPart, rightPart, res);
fillInfo(leftPart, rightPart, res);
}
solve();
}
}
http://blog.youkuaiyun.com/lyy289065406/article/details/6661421
不看网上的discuss我还真想不出这个思路:
1) 平衡状态,所有参与称重的硬币都是真的;
2) 非平衡状态,所有没有参与称重的硬币都是真的;
3) 若有一枚硬币既出现在重的一边,又出现在轻的一边,则这枚硬币是真的;
经过以上3重筛选,剩下的硬币恰好1枚,否则答案不唯一。
把上面的处理技巧记着吧,以后再有类似天平的题可以参考一下.

被折叠的 条评论
为什么被折叠?



