Posted on 2011-11-10 17:23
C小加 阅读(1227)
评论(1) 编辑 收藏 引用 所属分类:
解题报告
NYOJ地址:
http://acm.nyist.net/JudgeOnline/problem.php?pid=428题意都理解了好久好久,最后问了张云聪才知道题意,原来悖论是这样想滴。
我用样例解释一下题意:
第一组数据:很明显题上没有正确答案,所以概率是0,可是选项里边有0,你又不能选,所以产生悖论。
第二组数据:也没有正确答案,概率是0,选项里没有0,所以不会产生悖论。
第三组数据:选1/2对,选1/3也对,所以概率是5/6。选项里没有5/6,所以选择正确答案的概率是0,又因为有0这个选项,结果产生悖论。
理解题意之后,代码就很容易实现了,我想着用字符串处理会简单点,因为我要用map容器。不过结果要比想象中复杂的多,后来改用整型试了下,比想象中简单多了。
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <map>
#include <cmath>
using namespace std;
map<int,int> m;
map<int,int>::iterator iter;
int n;
void Init()
{
m.clear();
}
void Read()
{
string str;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int a,b;
scanf("%d/%d",&a,&b);
if(n%b) continue;
m[n/b*a]++;
}
}
bool Solve()
{
int sum=0;
for(iter=m.begin();iter!=m.end();iter++)
{
if(iter->first==iter->second)
{
sum+=iter->first;
}
}
if(sum==m[sum])
return false;
else if(m[0]==0)
return false;
else
return true;
}
int main()
{
//freopen("input","r",stdin);
int t;
cin>>t;
while(t--)
{
Init();
Read();
if(Solve())
{
printf("Yes\n");
}
else printf("No\n");
}
return 0;
}