题目链接:点击查看

题目大意:给出 n 个水杯,每个水杯最大容量为 aia_iai​,每个水杯初始时有 bib_ibi​ 的水,两个水杯之间可以互相倒水,不过每次会损失一半水量,更具体的说,假设第 iii 个水杯向第 jjj 个水杯中倒 xxx 单位的水(xxx可以为任意实数),那么操作之后两个杯子中的水会变为:bi−x,bj+x2b_i-x,b_j+\frac{x}{2}bi​−x,bj​+2x​,现在可以执行任意次数的倒水操作。

假设最终需要选则 kkk 个杯子,使得其水量之和尽量大,问最大可以是多少

现在问选取 k∈[1,n]k \in [ 1,n]k∈[1,n] 时的答案

题目分析:比赛的时候想到是 dpdpdp 了,但是推出了一个带有后效性的转移,然后自己把自己给否定了,没有继续思考下去,有点可惜

先不考虑倒水操作,那么设 dpi,j,kdp_{i,j,k}dpi,j,k​为前 iii 个杯子中,选择了 jjj 个杯子,杯子容量上限之和(∑a)(\sum a)(∑a)为 kkk 时的最大水量之和(∑b)(\sum b)(∑b),不难看出这是一个背包的变形,直接枚举转移即可,同时可以将第一维滚动进行,转移方程如下:
dpi,j,k=max{dpi−1,j,k不选择第i项dpi−1,j−1,k−ai+bi选择第i项dp_{i,j,k}=max \left\{ \begin{aligned} &dp_{i-1,j,k} &不选择第i项\\ &dp_{i-1,j-1,k-a_i}+b_i&选择第i项\\ \end{aligned} \right. dpi,j,k​=max{​dpi−1,j,k​dpi−1,j−1,k−ai​​+bi​​不选择第i项选择第i项​

最后直接枚举状态维护最大值即可,假设初始时所有水量之和为 sumbsumbsumb 现在需要选择 jjj 个杯子,且最大容量为 kkk 时,此时的答案就是 min(dpi,j,k+sumb−dpi,j,k2,k)min(dp_{i,j,k}+\frac{sumb-dp_{i,j,k}}{2},k)min(dpi,j,k​+2sumb−dpi,j,k​​,k)了,化简一下,且内部同时乘以 222,则变成了 min(dpi,j,k+sumb,2∗k)min(dp_{i,j,k}+sumb,2*k)min(dpi,j,k​+sumb,2∗k),维护一下最大值就可以了

代码:

// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110;int a[N],b[N],dp[2][N][N*N];int main()
{#ifndef ONLINE_JUDGE// freopen("data.in.txt","r",stdin);// freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,sa=0,sb=0;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",a+i,b+i);sa+=a[i];sb+=b[i];}for(int j=0;j<=n;j++)for(int k=0;k<=sa;k++)dp[0][j][k]=-inf;dp[0][0][0]=0;int t=1;for(int i=1;i<=n;i++,t^=1){for(int j=0;j<=n;j++)//不选第i个杯子for(int k=0;k<=sa;k++)dp[t][j][k]=dp[t^1][j][k];for(int j=1;j<=n;j++)//选第i个杯子for(int k=a[i];k<=sa;k++)dp[t][j][k]=max(dp[t][j][k],dp[t^1][j-1][k-a[i]]+b[i]);}for(int i=1;i<=n;i++){int ans=0;for(int j=0;j<=sa;j++)ans=max(ans,min(2*j,dp[t^1][i][j]+sb));printf("%.10f ",ans/2.0);}puts("");return 0;
}

CodeForces - 1459D Glass Half Spilled(dp)相关推荐

  1. CF1458B Glass Half Spilled

    CF1458B Glass Half Spilled 题意: 有n杯水,第i杯有容积aia_{i}ai​单位,初始时装有bib_{i}bi​单位的水 现在你可以进行若干次操作,每次选择一杯水的一定水量 ...

  2. CodeForces - 1312E Array Shrinking(区间dp)(通俗易懂)

    CodeForces - 1312E Array Shrinking(区间dp) 题目链接: 没做出来,看了一下别人的题解,才A掉.但网上没发现一篇讲得比较易懂的题解,所以就准备写一篇再加上我自己的理 ...

  3. 【CodeForces 1253C --- Sweets Eating】DP

    [CodeForces 1253C --- Sweets Eating]DP Description Tsumugi brought n delicious sweets to the Light M ...

  4. codeforces Palindromic characteristics(hash或者dp)

    1.动态规划 用dp(l,r)表示子串s[l..r]的回文串阶数.对于长度len为1的有dp(l,r)=1.对于长度len等于2的,看字符串左右是否相等即可.当r-l>1时,如果s[l]不等于s ...

  5. codeforces 808 E. Selling Souvenirs (dp+二分+思维)

    题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...

  6. Codeforces 429B Working out:dp【枚举交点】

    题目链接:http://codeforces.com/problemset/problem/429/B 题意: 给你一个n*m的网格,每个格子上有一个数字a[i][j]. 一个人从左上角走到右下角,一 ...

  7. CodeForces - 1551F Equidistant Vertices(暴力+dp)

    题目链接:点击查看 题目大意:给出一棵 nnn 个节点组成的树,问选出 kkk 个节点满足相互之间距离相等的方案数有多少 题目分析:n=100n=100n=100,感觉数据范围越小的题目越难发现 ta ...

  8. CodeForces - 1481E Sorting Books(贪心+dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,每次操作可以将任意一本书放到序列的末尾,问最少需要操作多少次,才能使得相同的数字挨在一起 题目分析:不难看出,对每个位置的数都操作一次,是 ...

  9. CodeForces - 1509C The Sports Festival(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,现在需要对其进行重排列,使得贡献之和最小 对于一个排列的贡献来说,对于每个 iii ,则 di=max(a1,a2,...,ai)−min ...

最新文章

  1. Ubuntu18彻底删除MySQL5.7数据库
  2. 分析无线充电线圈产生的导航信号在自绕工字型电感中的感应电动势
  3. linux下php的安装路径,Linux下Apache、PHP、MySQL默认安装路径
  4. 写Rap,编菜谱,你画我猜……这些 AI demo 我可以玩一天!
  5. mysql中的生日应该是什么类型_MySQL中的定点数类型
  6. 简单选择排序_Python3三种简单排序(冒泡、插入、选择)的比较
  7. 什么是IP地址?由哪几部分构成?IP地址分为几类?
  8. Linux内核分析课程期中总结
  9. nodejs实现同步http请求
  10. Windows黑客编程第二章
  11. 小汪Hibernate 学习之一 Hibernate 小例子
  12. 自动伽马校正(Auto Gamma Correction)算法
  13. AutoCAD输出矢量图
  14. PS剪切图的基本操作
  15. 电阻式湿度传感器原理
  16. MySQL 事务隔离级别
  17. 【技术公开课】iOS App研发的最后冲刺:内测与部署
  18. 单片机 switch c语言,单片机入门-C51语言switch-case语句电路应用实例
  19. amd编码器 hevc_支持 AMD VCE H.264 编码器在Bandicam录制视频 - Bandicam(班迪录屏)
  20. AutoCAD .Net 颜色系统

热门文章

  1. 【年度盘点】10个热门Python练习项目
  2. 异常处理-RestFul的异常处理
  3. SpringSecurity案例之认证服务搭建
  4. Springboot-RabbitMq 参数配置详解
  5. 幻读(phantom read)
  6. zookeeper的设计猜想-防止单点故障
  7. mybatis-批量操作
  8. 基于Xml 的IOC 容器-获得配置路径
  9. webfunny前端监控
  10. 【30分钟学完】canvas动画|游戏基础(1):理论先行