您的位置:首页 > 编程语言 > Go语言

[杂题]URAL1822. Hugo II's War

2015-03-16 00:29 120 查看
看懂题意的请直接跳过下一坨! 本人有表达障碍!

==========================================

题意: (题意真的很难很难懂啊!!! 去他娘的**)

有一个王国,王国里有一个国王(编号为1),他有(编号为2~n) n-1个臣子(这些臣子并不全和他有直接关系)

然后呢 国王要去打架,但是只有当他的x%个及以上的直系下属(与他有直接关系的臣子)做好打架的准备了,他才能去打架

他的直系下属也有下属,也要其中x%及以上的下属做好打架准备了,那些直系下属才会开始准备打架...直到最后一层下属(也就是没有下属的那些人)他们会直接开始准备打架

当然 (除了国王)所有臣子准备打架都需要时间$t_i$;

有一个上限时间T 臣子们准备的总时间不能超过T

给的是n(包括国王 共n个人(国王加臣子)),T

接下来是编号2~n的臣子们的信息(1号是国王) $p_i$和$t_i$

$p_i$代表该臣子是 编号为pi的人 的下属

$t_i$代表该臣子 准备打架需要的时间

问的是: 不超过T的情况下,准备战斗的臣子要尽量多,求x的最大值

是不是看了这么大一坨还是不知道讲什么...

那么我们来看个案例:

6 3
1 2
2 2
2 1
1 2
1 4

n=6 T=3 就是1个国王 5个臣子 臣子们要在3单位时间内准备好打架
接着

2号:1 2
3号:2 2
4号:2 1
5号:1 2
6号:1 4

他们的关系图是这样的:


#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps=1e-4;

vector<LL> son[10005], tmp, tot;
int a[10005];
LL sum[10005];

int main()
{
int n, t;
scanf("%d%d", &n, &t);
for(int i=2;i<=n;i++)
{
int x;
scanf("%d%d",&x,&a[i]);
son[x].push_back(i);
}
a[1]=0;
double l=0, r=100, ans;
while(fabs(l-r)>=eps)
{
double m=(l+r)/2.0;
memset(sum, -1, sizeof(sum));
tmp.clear();
tmp.push_back(1);
while(!tmp.empty())
{
int p=tmp[tmp.size()-1];
if(!son[p].size())
sum[p]=a[p], tmp.pop_back();
else
{
if(sum[son[p][0]]==-1)
{
for(int i=0;i<son[p].size();i++)
tmp.push_back(son[p][i]);
continue;
}
tot.clear();
for(int i=0;i<son[p].size();i++)
tot.push_back(sum[son[p][i]]);
sort(tot.begin(), tot.end());
int pp;
for(int i=0;i<son[p].size();i++)
if((i+1)*100.0/son[p].size()>=m)
{
pp=i;
break;
}
sum[p]=tot[pp]+(LL)a[p];
tmp.pop_back();
}
}
if(sum[1]<=t)
ans=m, l=m;
else
r=m;
}
printf("%.7lf\n", ans);
return 0;
}


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