CodeForces - 1459D - Glass Half Spilled

简介: 笔记

Glass Half Spilled


题意

在编号为 1的桌子上有 n个玻璃杯,第 i个杯子可以容纳最多 a i单位水,当前包含 b i单位水。

选择k 个玻璃杯,并尽可能多地收集水。为了达到这个效果,你可以把水从一个玻璃杯倒到另一个玻璃杯,想倒多少次就倒多少次 然而,每次你试图转移任何数量的水时,都会有一半的水洒在地板上。对于每个 k = 1 、 2 、 3 、 … n ,确定在零次或多次在玻璃杯之间转移水后,任意选择的k个玻璃杯可以收集的最大可能总量。


思路


10.png


代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000007
using namespace std;
typedef long long LL;
typedef pair<int, int>PII;
inline LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; }
const int N = 110;
int n;
int a[N], b[N];
double dp[2][N][N * N];
void solve() {
  cin >> n;
  int suma = 0, sumb = 0;
  for (int i = 1; i <= n; ++i) {
    scanf("%d %d", &a[i], &b[i]);
    suma += a[i];
    sumb += b[i];
  }
    //预处理
  for (int j = 0; j <= n; ++j)
    for (int k = 0; k <= suma; ++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 <= suma; ++k)
        dp[t][j][k] = dp[t ^ 1][j][k];
    for (int j = 1; j <= n; ++j) //选第i个杯子
      for (int k = a[i]; k <= suma; ++k)
        dp[t][j][k] = max(dp[t][j][k], dp[t ^ 1][j - 1][k - a[i]] + b[i]);
  }
  for (int j = 1; j <= n; ++j) {
    double res = 0;
    for (int k = 0; k <= suma; ++k)
      res = max(res, min(double (2.0 * k), dp[t ^ 1][j][k] + sumb));
    printf("%.10lf ", res / 2);
  }
  cout << endl;
}
int main() {
  //int t; cin >> t;
  //while (t--)
    solve();
  return 0;
}
目录
相关文章
|
6月前
Codeforces Round #192 (Div. 2) (330B) B.Road Construction
要将N个城市全部相连,刚开始以为是最小生成树的问题,其实就是一道简单的题目。 要求两个城市之间不超过两条道路,那么所有的城市应该是连在一个点上的,至于这个点就很好找了,只要找到一个没有和其他点有道路限制的即可。
18 0
|
6月前
|
算法
hdoj 4712 Hamming Distance(靠人品过的)
在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的字符不同的个数。换句话说,它就是将 一个字符串变换成另外一个字符串所需要替换的字符个数。
20 0
|
机器学习/深度学习 Java
codeforces Educational Codeforces Round 49 (Rated for Div. 2) C题
刚开始拿到这题很懵逼,知道了别人的思路之后开始写,但是还是遇到很多坑,要求求P2/S最大。p=a b。就是求(a2+ b2 +2ab)/ab最大,也就是a/b +b/a最大。那么题意就很明显了。
87 0
|
人工智能
Educational Codeforces Round 33
A. Chess For Three time limit per test1 second memory limit per test256 megabytes inputstanda...
1144 0
|
人工智能
Educational Codeforces Round 31 A B C
A. Book Reading time limit per test2 seconds memory limit per test256 megabytes inputstandard...
1079 0
Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861A k-rounding【暴力】
A. k-rounding time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard output ...
1227 0
数论 - Funny scales(SPOJ - SCALE)
Funny scales  Problem's Link  ---------------------------------------------------------------------------- Mean:  给定两个数n和x,有一个天平,初始时左盘为x,你需要从以下集合中选一些数字来放到两个盘中,使得两个盘相等(note:每个数字只能取一次)。
1017 0