悖论问题
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
先来看一个有趣的悖论:
如果你随机从下面的选项中选出一个答案,选到正确答案的概率是多少?
A.25% B.50% C.0% D.25%
当你仔细理解了上面的悖论之后,下面问题来了,如果现在随便给你一组选项,你能判断出它们是否必然产生悖论吗?
-
输入
-
第一行输入一个整数T(T<=50),表示测试数据的组数
每组测试数据的第一行是一个整数N,表示选项的个数,随后的一行有N个分数(ai/bi),表示N个选项的值(1<=N<=100000)。所有分数都以最简原分数表示(特别地,如果值是整数,则分母当作1),0<=ai,bi<=100000。
输出
- 如果产生悖论则输出Yes,否则输出No 样例输入
-
3 4 1/4 1/2 0/1 1/4 3 1/3 1/3 1/2 6 1/2 1/2 1/2 1/3 1/3 0/1
样例输出
-
Yes No
Yes
-
思路:题真心不易懂啊, 特别是这种逻辑学问题,看了网上的解释才隐隐明白。。。
-
/*1.如果选项中不存在0,则一定不悖论。 比如1/3 1/3 1/2 原因:只要发生相悖,则可以将其看作错误答案。可能 全部都是错误答案,则概率为0,而0木有,故一定不相悖。 2.如果选项中存在0,可能会出现悖论。 (1)分母如果不是n的因子的话,那么其一定不是正确答案。比如n=6,那么1/5用于不会得到 (2)分母如果是n的因子的话 例如:1/3 1/3 1/2 1/2 1/2 0/1 如果1/3是正确答案----则有2/6=1/3 如果1/2是正确答案----则有3/6=1/2 则选择正确答案的概率为1/3+1/2=5/6 不存在,则概率为0 而选项中又存在0 相悖。 如果0是正确答案 -----则与1/6 相悖。*/ #include <stdio.h> #include <map> using namespace std; map<int, int> m; map<int, int>::iterator it; int main() { int t, n, a, b, i, sum; scanf("%d", &t); while(t--) { m.clear(); scanf("%d", &n); for(i = 0; i < n; i++) { scanf("%d/%d", &a, &b); if(n%b == 0) { m[n/b*a]++; } } if(m[0] == 0) { printf("No\n"); } else { sum = 0; for(it = m.begin(); it != m.end(); it++) { if(it->first == it->second) { sum += it->first; } } if(sum == m[sum]) { printf("No\n"); } else { printf("Yes\n"); } } } return 0; }
-
第一行输入一个整数T(T<=50),表示测试数据的组数