CodeForces - 445C DZY Loves Physics

题目链接

https://codeforces.com/problemset/problem/445/C

解题思路

题意:求一个图的最大密度,密度定义:为顶点的价值和/边的价值和
题解:一个图最大的密度只由两个顶点构成。

证明:V1和V2边价值为a,构成图的最大密度。

若加上与V2相连的一个顶点V3最大,边的价值为b,则要求:V3/b>(V1+V2)/a;那么(V2+V3)/b,就是较大的。所以最大密度就是由两个顶点比他们的边得到的。

详细证明:
已知:V3/b>(V1+V2)/a
=> a*V3>b*(V1+V2)
=> a*V3+a*V2>b*V1+b*V2
=> a*(V3+V2)>b*(V1+V2)
=> (V3+V2)/b>(V1+V2)/a
求将某点加入使得价值最大的必要条件:
V总:已加入点的价值和;
v:要加入点的价值;
E总:已加入边的价值和;
e:加入点与已加入点所有边的价值和。
将此点加入的必要条件为(V总+v)/(E总+e)>V总/E总
=> (V总+v)*E总>(E总+e)*V总
=> V总*E总+v*E总>E总*V总+e*V总
=> v*E总>e*V总
=> v/e>V总/E总
所以,“若加上与V2相连的一个顶点V3最大,边的价值为b,则要求:V3/b>(V1+V2)/a”

AC代码

#include<bits/stdc++.h>
#define ll long long

using namespace std;
const int N=600;
int n,m,a,b;
double vv[N],c,ans;

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    scanf("%lf",&vv[i]);

    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%lf",&a,&b,&c);
        ans=max(ans,(vv[a]+vv[b])/c);
    }

    printf("%.15lf\n",ans);
}

总结

记住什么是图的最大密度
记住两点构成最大密度

思维 文章被收录于专栏

思维题都会了,ACM金牌就稳了! 我骗你的!

全部评论

相关推荐

感觉他们一点都不了解现在这个社会就业有多难,已经在牛客刷到好多篇&nbsp;延毕的帖子了,延毕就会导致已经找好的工作就没了,还得重新再找,学校和老师们是怎么想的呢????看到学生丢失工作会开心吗&nbsp;就业数据都在造假,真实的就业困难不去解决&nbsp;一个个真是好样的
从今天开始狠狠卷JVAV_癫:学生看到的是导师不放实习导致offer黄了。 导师看到的是招进来的学生吃自己补助和自己的招生名额,却没给自己升迁带来任何帮助,还要跑路。 根本利益的不一致,最主要留校的导师大概率是职场上招聘失败的,被迫留校的,什么牛鬼蛇神都会有
点赞 评论 收藏
分享
龙珠传说:nb,公务员解约不需要支付违约金吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务