把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

CF444A DZY Loves Physics【结论】

题目传送门

话说这道题不分析样例实在是太亏了...结论题啊...

但是话说回来不知道它是结论题的时候会不会想到猜结论呢...毕竟样例一、二都有些特殊。

观察样例发现选中的子图都只有一条边。

于是猜只有一条边的时候解最优。

飞快地写个暴力,然后和结论对拍,然后假装这个结论是对的,然后就AC了(大雾

 

还是证明一下这个结论吧:

 

 

 用反证法。

设这样三个点的点权分别为A,B,C,两条边的边权为n,m

假设子图中有A,B,C三个点比只有两个点更优。

也就是三个点都选的答案比只选AB和只选BC都大。

三个都选的答案:(A+B+C)/(n+m)

只选AB:(A+B)/m

只选BC:(B+C)/n

则:

(A+B+C)/(n+m)>(A+B)/m

(A+B+C)/(n+m)>(B+C)/n

化简:(权都是正数)

(A+B+C)m>(A+B)(n+m)

(A+B+C)n>(B+C)(n+m)

Cm>An+Bn

An>Bm+Cm

相加:
Cm+An>An+Bn+Bm+Cm

0>Bn+Bm

由于Bn,m都是正数,导出矛盾。

所以假设不成立。

 

另外,如果AC之间有连边的话,那三个都选肯定更不优,分子不变,分母变大了嘛。只选AC都不用讨论,至少在这种情况下三个都选干不过只选ABBC

 

暴力程序(拿来对拍)

有同学写的2n枚举子集的暴力,我觉得略麻烦,还是更喜欢自己的(笑)

甚至还想优化一下自己的暴力,就是在以1以外的点为起点的时候,就不把1加进去,因为1有的状态已经在1为起点的算过了。

但是反正是拿来写对拍嘛,节约考试时间。

复制代码
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<vector>
 4 #include<queue>
 5 using namespace std;
 6 #define N 505
 7 #define ll long long
 8 int n,m;
 9 int a[N];
10 bool vis[N];
11 double ans=0.0;
12 vector<pair<int,int> >G[N];
13 int rd()
14 {
15     int f=1,x=0;char c=getchar();
16     while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
17     while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
18     return f*x;
19 }
20 void dfs(int u,int d,int b)
21 {
22     for(int i=0;i<G[u].size();i++)
23     {
24         int v=G[u][i].first;
25         if(vis[v]) continue;
26         vis[v]=1;
27         int tmp=0;
28         for(int j=0;j<G[v].size();j++)
29             if(vis[G[v][j].first]) tmp+=G[v][j].second;
30         dfs(v,d+a[v],b+tmp);
31         vis[v]=0;
32     }
33     if(b==0) return ;
34     ans=max(ans,1.0*d/b);
35 }
36 int main()
37 {
38     n=rd(),m=rd();
39     for(int i=1;i<=n;i++)
40         a[i]=rd();
41     for(int i=1;i<=m;i++)
42     {
43         int u=rd(),v=rd(),w=rd();
44         G[u].push_back(make_pair(v,w));
45         G[v].push_back(make_pair(u,w));
46     }
47     for(int i=1;i<=n;i++)
48     {
49         vis[i]=1;
50         dfs(i,a[i],0);
51         vis[i]=0;
52     }
53     printf("%.9f\n",ans);
54     return 0;
55 }
56 //不分析样例真的是个不好的习惯啊 
Code
复制代码

正解程序:(比暴力好写)

复制代码
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<vector>
 4 #include<queue>
 5 using namespace std;
 6 #define N 505
 7 #define ll long long
 8 int n,m;
 9 int a[N];
10 double ans=0.0;
11 int rd()
12 {
13     int f=1,x=0;char c=getchar();
14     while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
15     while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
16     return f*x;
17 }
18 int main()
19 {
20     n=rd(),m=rd();
21     for(int i=1;i<=n;i++)
22         a[i]=rd();
23     for(int i=1;i<=m;i++)
24     {
25         int u=rd(),v=rd(),w=rd();
26         ans=max(ans,1.0*(a[u]+a[v])/w);
27     }
28     printf("%.9f\n",ans);
29     return 0;
30 }
Code
复制代码

 

posted @   Starlight_Glimmer  阅读(197)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示