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;
}
目录
相关文章
Codeforces Round #192 (Div. 2) (330B) B.Road Construction
要将N个城市全部相连,刚开始以为是最小生成树的问题,其实就是一道简单的题目。 要求两个城市之间不超过两条道路,那么所有的城市应该是连在一个点上的,至于这个点就很好找了,只要找到一个没有和其他点有道路限制的即可。
50 0
【CodeForces】Codeforces Round 857 (Div. 2) B
【CodeForces】Codeforces Round 857 (Div. 2) B
139 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最大。那么题意就很明显了。
121 0
|
人工智能
Educational Codeforces Round 33
A. Chess For Three time limit per test1 second memory limit per test256 megabytes inputstanda...
1172 0
|
人工智能
Educational Codeforces Round 31 A B C
A. Book Reading time limit per test2 seconds memory limit per test256 megabytes inputstandard...
1113 0
Codeforces 833E Caramel Clouds
E. Caramel Clouds time limit per test:3 seconds memory limit per test:256 megabytes input:standard input output:standard out...
1165 0
数论 - Funny scales(SPOJ - SCALE)
Funny scales  Problem's Link  ---------------------------------------------------------------------------- Mean:  给定两个数n和x,有一个天平,初始时左盘为x,你需要从以下集合中选一些数字来放到两个盘中,使得两个盘相等(note:每个数字只能取一次)。
1055 0