首页 > 其他分享 >CF2023D Many Games 题解

CF2023D Many Games 题解

时间:2024-10-22 11:12:47浏览次数:1  
标签:le frac int 题解 times Games Many 100 define

赛时被创四了。

思路

考虑我们什么时候合并会比原来优。

例如,我们现在要合并 \(p_1,w_1\) 和 \(p_2,w_2\),同时保证,\(w_1\ge w_2\)。

那么有:

\[\frac{p_1}{100}\times w_1\le \frac{p_1}{100}\times \frac{p_2}{100}\times (w_1+w_2) \]

\[\frac{p_2}{100}\times w_2\le \frac{p_1}{100}\times \frac{p_2}{100}\times (w_1+w_2) \]

转换一下:

\[\frac{p_1}{100}\times (\frac{p_2}{100}\times (w_1+w_2)-w_1)\ge 0 \]

\[\frac{p_2}{100}\times (\frac{p_1}{100}\times (w_1+w_2)-w_2)\ge0 \]

由于 \(p1,p2\ge 1\)。

\[\frac{p_2}{100}\times (w_1+w_2)-w_1\ge 0 \]

\[\frac{p_1}{100}\times (w_1+w_2)-w_2\ge0 \]

所以:

\[\frac{100-p_2}{100}w_1\le \frac{p_2}{100}w_2\ \]

\[\frac{p_1}{100}w_1\ge \frac{100-p_1}{100}w_2 \]

消掉系数。

\[\frac{(100-p_1)w_2}{p_1}\le w_1\le \frac{p_2w_2}{100-p_2}\\ \]

这个不等式可以推出 \(w_1\le p_2w_2\)。

这告诉我们当 \(w\) 的和超过 \(p_2w_2\) 时,合并一定不优。

那么去掉 \(p=100\) 的情况,所有选出的 \(w\) 一定小于等于 \(4\times 10^5\)。

这种情况下,我们可以做一个背包。

复杂度是 \(O(nV)\) 的。

接着,我们可以发现,有很多二元组是没有用的。

具体来说,对于 \(p\) 相同的二元组,我们按 \(w\) 从大到小排序以后。我们采用的一定是一段前缀。

而这一堆前缀的总和也没有很多,大约是 \(99\times \ln99\)。

因此我们可以在加入一个二元组的时候判断一下是否对背包产生了贡献,如果没有,那么之后相同的 \(p\) 就没有必要加入背包了。

Code

/*
  ! 前途似海,来日方长。
  ! Created: 2024/10/20 18:08:39
*/
#include <bits/stdc++.h>
using namespace std;

#define x first
#define y second
// #define int long long
#define mp(x, y) make_pair(x, y)
#define eb(...) emplace_back(__VA_ARGS__)
#define fro(i, x, y) for (int i = (x); i <= (y); i++)
#define pre(i, x, y) for (int i = (x); i >= (y); i--)
inline void JYFILE19();

using i64 = long long;
using pii = pair<int, int>;

bool ST;
const int N = 1e6 + 10;
const int mod = 998244353;

int n, m, vs[N];
double sm;
double ns;
double f[N];
struct Node {
  int p, w;
  inline bool operator<(const Node&tmp) const { return w > tmp.w; } 
} d[N];

signed main() {
  JYFILE19();
  cin >> n;
  fro(i, 1, n) cin >> d[i].p >> d[i].w;
  sort(d + 1, d + n + 1);
  f[0] = 1;
  fro(i, 1, n) {
    if (d[i].p == 100) sm += d[i].w;
    else {
      if (vs[d[i].p]) continue;
      int h = d[i].p * d[i].w / (100 - d[i].p);
      double r = d[i].p / 100.;
      bool flag = 0;
      pre(j, h, 0)
        if (f[j + d[i].w] < f[j] * r)
          f[j + d[i].w] = f[j] * r, flag = 1;
      if (flag == 0) {
        vs[d[i].p] = 1;
      }
    }
  }
  fro(i, 0, 400000) ns = max(ns, (i + sm) * f[i]);
  printf("%.9lf\n", ns);
  return 0;
}

bool ED;
inline void JYFILE19() {
  // freopen(".in", "r", stdin);
  // freopen(".out", "w", stdout);
  srand(random_device{}());
  ios::sync_with_stdio(0), cin.tie(0);
  double MIB = fabs((&ED - &ST) / 1048576.), LIM = 32;
  cerr << "MEMORY: " << MIB << endl, assert(MIB <= LIM);
}

标签:le,frac,int,题解,times,Games,Many,100,define
From: https://www.cnblogs.com/JiaY19/p/18492186

相关文章

  • 01 Eclipse使用Maven慢的问题解决
    1.Eclipse使用的是内置的MavenEclipse有可能使用了内置的Maven,而不是独立安装的Maven。如果使用Eclipse内置的Maven,默认的settings.xml可能并未生成。你可以按以下步骤检查或修改Maven设置路径:a.检查Eclipse使用的Maven配置点击Window->Preferences在......
  • 【题解】Solution Set - NOIP2024集训Day58 字符串
    【题解】SolutionSet-NOIP2024集训Day58字符串https://www.becoder.com.cn/contest/5658「CF1466G」SongoftheSirens考虑对于\(s_i\),算钦定必须覆盖到\(t_i\)的匹配个数\(f_i\)。注意到\(s\)每次长度都会\(\times~2\)左右,其长度在\(O(\log|w|)\)的时候就......
  • CF2023 - D. Many Games
    先让\(p\)除以\(100\),相当于给你两个数组\(p,w\),然后要选择下标集合\(S\),使得:\(p\)的积乘上\(w\)的和最大化。注意到\(p_i\)是整数,并且\(1\lep_i\le100\)。那么容易想按照\(p_i\)分类。然后\(w_i\)对于固定\(p\)一定是选择排序后的最大值后缀。目前\((......
  • noi.ac775题解
    Gameb文件OI:gameb时限:1000ms空间:512MiBAlice和Bob正在玩一个游戏。具体来说,这个游戏是这样的,给定一个数列,从Alice开始,两个人轮流操作,每次操作可以从数列的头部或者尾部删去一个数字,当这个数列满足一定条件的时候,最后一次操作的人获胜。如果一开始就满足条......
  • ZZJC新生训练赛第七场题解
    难度分类(同一难度下按字典序上升)入门:C简单:G,D中等:E,H,F,A困难:BC-解题思路数一下每个字母的数量看是不是偶数就可以得到答案。C-代码实现#include<bits/stdc++.h>intmain(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout......
  • NOI2024 D1T1 - 集合 题解
    观察我们称\(x\)在一段序列中的“位置集合”为\(x\)出现的下标的集合。注意到,两段序列能够匹配,当且仅当两段序列的\(1\simm\)中的数的位置集合构成的多重集相等。快速比较集合,考虑哈希。哈希先实现一个从整数到整数的哈希\(f(x)\)。使用这个哈希的目的是为了提高随机......
  • 题解 P11220 / MX241020D【【MX-S4-T4】「yyOI R2」youyou 的三进制数】
    好长的标题题目描述现在有\(0\simn\)共\(n+1\)个数。定义\((x)_{3}\)表示十进制数\(x\)的三进制形式。如果没有特别强调,那么这些数均为十进制形式。youyou想构造一个序列长度为\(p\)(\(p\ge1\))的非负整数序列\(a\)。使之满足:\(a_i\in[0,n]\)。不存在\(i......
  • P9890 [ICPC2018 Qingdao R] Tournament 题解
    P9890[ICPC2018QingdaoR]Tournament题目传送门更好的阅读体验一道找规律的思维题。前置知识\(lowbit\)\(lowbit\)是指获取一个二进制数中最右边的\(1\)所对应的数值。具体地,\(lowbit\)可以通过对一个数取反然后加\(1\),再与原数进行按位与的方式来实现。intlow......
  • ZZJC新生训练赛第六场题解
    先给出比赛链接:下面说一下难度分层:(同一难度下按字典序排序)Easy(简单):BHMedium(中等):DEHard(困难):AGAnti-AK(防AK):CFA扣分扣分扣分!扣分!二维前缀差分板子题题目要求对二维区间加某个数或者查询二维区间的和与一维前缀和类似地,我们定义$sa[i][j]$为区间(......
  • 「题解」Codeforces Round 980 (Div. 2)
    before\(A\simD\)的题解A.ProfitableInterestRateProblemA.ProfitableInterestRateSol&Code数学题,有\(a-x\geqb-2x\),得\(x=b-a\)。特判\(a\geqb\)以及\(a<x\)的情况即可。#include<bits/stdc++.h>#defineM10001#defineN......