NYOJ 428 悖论问题
描述
先来看一个有趣的悖论:
如果你随机从下面的选项中选出一个答案,选到正确答案的概率是多少?
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
思路;在别人的代码基础上了解了题目意思。 - 附上我的理解。
-
View Code
1 /* 2 1.如果选项中不存在0,则一定不悖论。 3 比如1/3 1/3 1/2 4 原因:只要发生相悖,则可以将其看作错误答案。可能 5 全部都是错误答案,则概率为0,而0木有,故一定不相悖。 6 2.如果选项中存在0,可能会出现悖论。 7 (1)那么ai>bi的情况,那么其一定不是正确答案。 8 (2)对于ai<=bi 9 (1)分母如果不是n的因子的话,那么其一定不是正确答案。比如n=6,那么1/5用于不会得到 10 (2)分母如果是n的因子的话,通分后,其分子的大小全部等于其出现的次数 11 超过2的话,是悖论,否则不是是悖论。 12 例如:1/3 1/3 1/2 1/2 1/2 0/1 13 如果1/3是正确答案----则有2/6=1/3 14 如果1/2是正确答案----则有3/6=1/2 15 则选择正确答案的概率为1/3+1/2=5/6 不存在,则概率为0 16 而选项中又存在0 相悖。 17 如果0是正确答案 -----则有1/6 相悖。 18 19 */ 20 21 #include<iostream> 22 #include<cstdio> 23 #include<cstring> 24 #include<cstdlib> 25 using namespace std; 26 int cnt[100010]; 27 int main() 28 { 29 int test,n,ai,bi; 30 scanf("%d",&test); 31 while(test--) 32 { 33 memset(cnt,0,sizeof(cnt)); 34 scanf("%d",&n); 35 for(int i=0;i<n;i++) 36 { 37 scanf("%d/%d",&ai,&bi); 38 if(n%bi)continue; 39 int t=ai*n; 40 if(ai <= bi) cnt[t/bi]++; 41 } 42 if(cnt[0]==0) //puts("No");//选项中不存在0 43 printf("No\n"); 44 else //选项中存在0 45 { 46 int cn=0; 47 for(int i=1;i<n;i++) 48 { 49 if(i==cnt[i]) cn++; 50 if(cn==2) break; 51 } 52 if(cn==1) //puts("No"); 53 printf("No\n"); 54 else //puts("Yes"); 55 printf("Yes\n"); 56 } 57 } 58 }