这年头,小学数学没学好连卸载软件的资格都没有。
下面只有一个按钮说了真话。那么谁是卸载按钮?
A:是B!
B:是D!
C:不是我!
D:B撒谎!
非常常见的逻辑题了,小学3年级就开始见 。现在用代码来解决它。首先有2种实现思路,一种是枚举说真话的按钮,另一种是枚举卸载按钮(合理假设:卸载按钮有且只有1个)。前者貌似比后者难,因此我们枚举卸载按钮,并验证说真话的按钮个数是否等于1。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define rep(i,a,b) for(int i = (a);i <= (b);++i)
#define re_(i,a,b) for(int i = (a);i < (b);++i)
#define dwn(i,a,b) for(int i = (a);i >= (b);--i)
const int SZ = 1e3 + 3;
template<typename Type>inline void read(Type &xx){
Type f = 1;char ch;xx = 0;
for(ch = getchar();ch < '0' || ch > '9';ch = getchar()) if(ch == '-') f = -1;
for(;ch >= '0' && ch <= '9';ch = getchar()) xx = xx * 10 + ch - '0';
xx *= f;
}
//first=说真话的按钮,second=卸载按钮
pair<char,char> solve(){
re_(i,0,3){
int a[4] = {i == 1,i == 3,i != 2,i != 3};
if(accumulate(a,a+4,0) == 1){
return {max_element(a,a+4)-a+'A',i+'A'};
}
}
return {'E','E'};
}
int main(int argc, char** argv) {
pair<char,char> res = solve();
cout << res.first << " " << res.second << endl;
return 0;
}
结果:D说真话,C是卸载按钮。