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 }                              

 

posted on 2012-07-30 20:50  L_S_X  阅读(337)  评论(0编辑  收藏  举报

导航