题解:UVA1456 Cellular Network

UVA1456 Cellular Network 题解

夭寿了!30 行写完紫题了!

更新:已联系管理员修改难度,现在是绿题

题意很简单,不再赘述。

首先一个小贪心,将概率 u 进行从大到小的排序,优先查看概率大的区域,显然这样能够保证访问数量期望最小。

接着考虑如何将区域分组。一个显而易见的思路是动态规划。

fi,j 表示前 i 个区域被分成 j 组,并全部访问完后期望的最小值。

则有如下转移:

fi,j=min0k<i{fk,j1+x=k+1iux}

求个前缀和可以在 O(n) 内完成转移。总时间复杂度为 O(n2w),完全足够通过本题。

代码如下:

#include<bits/stdc++.h> #define MAXN 110 using namespace std; typedef long long ll; int t, n, w; ll u[MAXN], sum[MAXN], dp[MAXN][MAXN]; int main(){ scanf("%d",&t); while(t--){ scanf("%d%d",&n,&w); for(int i = 1; i <= n; i++) scanf("%d",&u[i]); sort(u + 1, u + n + 1, greater<int>()); for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + u[i]; memset(dp, 0x3f, sizeof(dp)); dp[0][0] = 0; for(int i = 1; i <= n; i++){ for(int j = 0; j <= i; j++){ for(int k = 1; k <= w; k++){ dp[i][k] = min(dp[i][k], dp[j][k - 1] + i * (sum[i] - sum[j])); } } } printf("%.4f\n",dp[n][w] * 1.0 / sum[n]); } }

__EOF__

本文作者NightTide
本文链接https://www.cnblogs.com/NightTide/p/18434005.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Night_Tide  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示