您的位置:首页 > 其它

开学能力测试t2 删点游戏

2018-03-05 21:31 417 查看

问题 : 删点游戏(graph)

时间限制: 1 Sec  内存限制: 128 MB
提交: 20  解决: 12
[提交][状态][讨论版][命题人:sxz]

题目描述

LYK有一张n个点m条边组成的带点权和边权的无向简单图(没有重边和自环)。
LYK为了学习关于图论的知识,它决定玩一个游戏。这个游戏是这样的。每一次,LYK可以选择在图中的点的任意一个点,并把这个点与这个点相连的边全部删除,得到一张新的图。
LYK可以执行这个删除操作若干次,直到它想让这个游戏停止为止。但这个游戏停止需要满足一个条件,剩下的点两两之间都是可达的,并且至少有2个点。
当LYK结束这个游戏时,LYK会获得一个欢乐值,这个欢乐值定义为这张图剩下的点权和与边权和的比。LYK想让最后得到的欢乐值最大。特别地,如果无法结束这个游戏,LYK将会获得0点欢乐值。你能帮帮它吗?

输入

一开始有两个数n,m,如题意所示。
第二行有n个数ai表示这个图中第i个点的点权。
接下来有m行每行三个数u,v,z(1<=u,v<=n,且u!=v),表示一条连接u,v的边权为z的边。

输出

你需要输出LYK停止游戏时能得到的最大的欢乐值,保留小数点后两位数字。

样例输入

3 32 3 42 3 51 2 31 3 4

样例输出

1.67

提示

样例解释

删除编号为3的点。

 

对于20%的数据n=2

对于50%的数据n<=5

对于100%的数据1<=n,m<=100000,1<=ai,z<=1000,且输入均为正整数。

初看题目可能无从下手,甚至可能想到爆搜。但是毫无疑问肯定超时,所以想到在纸上模拟。
可以模拟出结论,最后取到的肯定是一条边和两个点。下面给出证明。
利用糖水不等式:
    糖水不等式,顾名思义是喝糖水时得出的不等式(逃
    你有一杯贼浓的糖水,以及一杯贼淡的糖水。根据生活经验,肯定能得出混合两杯糖水浓度肯定比第一杯要淡。
    假设第一杯的浓度为(a/b)=k1,第二杯的浓度为(c/d)=k2,k1<k2,那么就有((a+c)/(b+d))<k1。
证明很简单:
    设k2*x=k1,那么(c*x/d)=k1。

    根据合分比定理,有((a+c*x)/(b+d))=k1。

    由于x=k1/k2>1,则有((a+c)/(b+d))<k1。

    证毕。

于是可以得到无论有多少条边,取得必定是一条边和两个顶点中比值最大的一条。下面给出代码。#include <iostream>
#include <cstdio>
using namespace std;
int p[100009];
float maxn(float a,float b){return a<b?b:a;}
int main()
{
int n,m,a,b,c;
float ans=0;
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%d",p+i);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
ans=maxn(ans,((p[a]+p[b])*1.0/c));

}
printf("%.2f",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图论 数论