topcoder srm 495 div1 275 && 500

标签:
topcodersrm495div1it |
分类: Topcoder |
275分:
题目描述:
有N个纸牌,正面依次编号1~N,反面有颜色,素数为红色,否则为蓝色。
现在从这N个纸牌中抽取x张,按照由小到大的顺序摆放,反面朝上,问这x张有几张可以确定数字,能的话是多少。
N = 1000, x = 50
解题报告:
正反两边扫描
正向:从1~N,凡是满足颜色的就记录,得到数组A
反向:从N~1,凡是满足颜色的就记录,得到数组B
AB数据相同的就是可以确定的,否则不能确定。
代码如下:
http://s4/middle/64675f54t9afe8bad2293&690srm
500分:
题目描述:
有N个盒子,只有一个盒子是空的,其他都有萝卜,并且每个盒子都有一定的信息,指示其他的盒子是否为空,
比如有3个盒子的关系矩阵如下
YYN
NYY
YNY
表示第一个盒子可以知道第二个盒子有没有东西,
第二个盒子可以知道第三个,第三个盒子可以知道第一个。
问你兔子不用打开空的盒子就可以找出空的盒子的概率是多大,假定兔子采用最优策略。
例子:
YYYY
NYNN
NNYN
NNNY
概率为0.75(采用最优策略,盒子不在第一个盒子的概率为0.75,一旦兔子打开第一个盒子,就可以知道哪个盒子是空的)
解题报告:
把关系矩阵缩点后,很容易知道,从所有入度为0的点出发,可以得到所有盒子的信息。
假设有N个盒子,缩点后有k个点,那么我们至少可以以 (N - k) / N的概率找到空盒子(即空盒子不在那k个里面的概率)
但是这个不一定是最优的,比如
YNNN
NYNN
NNYN
NNNY
这样缩点后仍然是四个,(4 - 4) / 4 = 0不是最优的策略。
这种情况,存在更优的一种策略:即能够得到N - 1个盒子的信息,也便能够推测出N个盒子的信息(因为只有一个是空的)。
所以,得到如下算法:
对关系图缩点,得到k个点。
暂定概率为(N - K) / N
然后检测C(K, K - 1)能否推测出N - 1个盒子的信息(可以利用floyd简化处理),如果可以,概率就优化为:(N - (K
- 1)) / N
主体代码如下:
int belong[SIZE], num[SIZE], cnt;
int dfn[SIZE], low[SIZE], index, instack[SIZE], sta[SIZE],
top;
vector<int> v[SIZE];
void tarjan(int id)
{
}
void solve(int n)
{
}
bool rd[SIZE];
double theProbability(vector <string>
str)
{