您的位置:首页 > 其它

Codeforces Beta Round #83 DIV2

2011-08-24 21:23 148 查看
这一晚上。。。板子硬了点,睡的不太舒服,等会儿回宿舍补一觉~

在ID之间纠结了一阵子后,偶还是决定沿用Moon_1st这个ID,偶滴品牌不能丢了~ ^_^。

A:单纯模拟的~

B:刚开始想麻烦了,直观的想法是先排一下序,然后比较所有相邻且不同的数对,如果a(i+1)<=2*ai,那么必然输出Yes,由于(2^ai-1)^2 = 2^(2*ai)-2^(ai+1)+1,偶一直在考虑2^(ai+1)是否会对结果产生不利影响,不大容易看~但是从小case逐步增加的具体过程发现,除了ai==1的请况有影响外,其他的影响会随着ai的增大逐步递减,也就是没有影响。所以排序后直接判断相邻且不相等的数对就可以了。

C:一开始还兴冲冲地以为自己终于在正式比赛里碰到个网络流,没想到越看越不对劲,到最后正式确认是个水题~~不过孤立节点的trick需要注意一下,偶就改了一次,还好没被人cha到~

D:这个偶就木有什么发言权了,ff很快就秒掉了额。。。。偶还在纠结怎么写。。。直观的想法是sigma(C(sh-1, i)*C(sum-a[h], n-i-1)/C(sum-1,n-1)) (i=1,2,3,......,n-1)。偶还在想难道让偶用java BigDecimal么??不太确信用C++怎么写,先看得第五题,结果还是不会啊~看完后lock了一下代码,发现某些人C题有trick,然后就开始找人cha(貌似应该说hack)。。。。越hack越起劲啦,哈哈,头一次在cf里hack,四次都命中啦~也没再干别的。赛后听方方说你边乘边除不就算出结果来了么,偶想了想也是啊~View Code

#include <iostream>
#include <cstdio>
#include <ctime>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;

#define MP(x, y) make_pair(x, y)
#define FOR(i, x, y) for((i) = (x); (i) <= (y); (i)++)

typedef long long llg;

const int N = 1010;
const int inf = 0x7fffffff;

int n, m, next
, r
, d
;

struct node
{
int tank, tap, val;
};

vector <node> g;

bool cmp(const node &a, const node &b)
{
return  a.tank < b.tank;
}

void deal(int u)
{
int i, limit = inf;
node tmp;
if(next[u] == 0)  return;
for(i = u; next[i] != 0; i = next[i])
limit = min(limit, d[i]);
tmp.tank = u;
tmp.tap = i;
tmp.val = limit;
g.push_back(tmp);
}

int main()
{
int i, a, b, c, len;
memset(next, 0, sizeof(next));
memset(r, 0, sizeof(r));
scanf("%d%d", &n, &m);
for(i = 0; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
next[a] = b;
r[b] = a;
d[a] = c;
}
g.clear();
for(i = 1; i <= n; i++)
if(r[i] == 0)
deal(i);
sort(g.begin(), g.end(), cmp);
len = g.size();
printf("%d\n", len);
for(i = 0; i < len; i++)
printf("%d %d %d\n", g[i].tank, g[i].tap, g[i].val);
return  0;
}


  

补一下D的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int N = 1010;

int n, m, h, sum, s
;
double ans, a[105], b[105];

int main()
{
int i;
scanf("%d%d%d", &n, &m, &h);
sum = 0;
for(i = 1; i <= m; i++)
{
scanf("%d", s+i);
sum += s[i];
}
if(sum < n)  printf("-1\n");
else
{
for(i = 1; i < n; i++)
{
a[i] = (double)(sum-s[h]-i+1);
b[i] = (double)(sum-i);
}
ans = 1.0;
for(i = n-1; i > 0; i--)  ans = ans*a[i]/b[i];
printf("%.8f\n", 1.0-ans);
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: