CF2023D - Many Games

news/2024/11/13 10:12:02/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18537949

HDK: 他妈的,这个看着也不像 2900 啊,为啥控我这么久

lbtl: 他不控你这么久不就不是 2900 了吗

暴力

一个比较明显的暴力思路是,如果我们钦定选定的物品的价值,那么可以比较容易地由背包 DP 算出能达到这个钦定值的最大概率

\([0,\sum w_i]\) 枚举所有可能的价值,暴力跑若干次背包,可以通过高达六个测试点

暴力
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int p[200001],w[200001];
long double f[200001];
signed main(){cin>>n;int totw=0;for(int i=1;i<=n;++i){cin>>p[i]>>w[i];totw+=w[i];}long double ans=0;for(int i=1;i<=totw;++i){for(int j=0;j<=i;++j){f[j]=0;}for(int j=1;j<=n;++j){for(int k=i;k>=w[j];--k){f[k]=max(f[k],f[k-w[j]]*p[j]/100.0);}f[w[j]]=max(f[w[j]],(long double)p[j]/100.0);}ans=max(ans,f[i]*i);}printf("%.8Lf",ans);
}

优化

一个比较 naive 的优化是,你发现你根本就不用钦定选定价值,直接跑一遍背包就能把所有答案跑出来,但是因为太 naive 了,仍然只有六个测试点的高分

第一个优化是对我们枚举上界的优化

推一遍式子,考虑设当前 \(\sum \frac{p_i}{100}=x,\sum w_i=y\)

当加入物品 \((p,w)\) 时对答案有正贡献,当且仅当

\[\begin{aligned}xy&\lt x\times \frac{p}{100}\times (y+w)\\y&\lt \frac{p}{100}(y+w)\\(1-\frac{p}{100})y&\lt\frac{p}{100}w\\y&\lt\frac{pw}{100-p}\end{aligned} \]

由于题目规定 \(pw\le 2\times 10^5\),而 \(p\) 的下界是 \(1\),因此加入物品 \((p,w)\) 时对答案有正贡献的一个必要条件是 \(\sum\limits w_i\le 2\times 10^5\)

这样我们就将答案区间 从 \([0,\sum w_i]\) 降到 \([0,2\times 10^5]\)

但是

喜报,复杂度还是不对

我们再考虑其他两个优化

第二个优化是,我们贪心地想,选择 \(p_i=100\)\(i\) 一定是最优的,因此我们可以提前将 \(p_i=100\)\(i\) 全部选上,这样既压缩了答案区间也减少了物品数量

第三个优化是,我们观察剩下的 \(p_i\neq 100\) 的物品,如果我们将 \(p_i\) 相同的 \(i\) 分成同一组,并且让每一组内按照 \(w_i\) 降序排列,根据贪心思路,当 \(p\) 相同的时候,应该是 \(w\) 越大越好,最终答案一定是形如从每个 \(p_i\) 的组内选出一个前缀

和刚才的思路类似,现在我们钦定我们选择的物品的 \(p_i\) 都为 \(p\),如果我们给当前 \(p\) 选择的前缀长度从 \(k\) 增加到 \(k+1\),答案更优当且仅当(这里挂 \(100\) 太麻烦了,在下面几个式子里钦定 \(p=\frac{p_i}{100}\)

\[\begin{aligned}p^k\times \sum\limits_k w\lt p^{k+1}\times(w_{k+1}+\sum\limits_k w)\end{aligned} \]

由于新加入的 \(w_{k+1}\) 不大于已有的任何一个数,因此有 \(k\times w_{k+1}\le\sum\limits_k w_i\),因此

\[\begin{aligned}p^k\times \sum\limits_k w&\le p^{k+1}\times\frac{k+1}{k}\times\sum\limits_k w_i\\\frac{k+1}{k}&\lt p\\k+1&\lt k\times p\\k\lt \frac{1}{1-p}\end{aligned} \]

这个式子意味着只有前 \(\frac{1}{1-p}\) 个物品有可能成为最优解

赛时止步于只写了两个优化,比较可惜

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int p[200001],w[200001];
struct item{int w,p;
}a[200001];
int cnt=0;
long long orians;
long double f[200001];
long double ans;
vector<int>v[101];
signed main(){cin>>n;for(int i=1;i<=n;++i){cin>>p[i]>>w[i];v[p[i]].push_back(w[i]);if(p[i]==100) orians+=w[i];}for(int i=1;i<=100;++i){sort(v[i].begin(),v[i].end(),greater<int>());}for(int i=1;i<=99;++i){int tot=0;for(int j=0;j<=(int)v[i].size()-1;++j){if(tot>100/(100-i)) break; a[++cnt]={v[i][j],i};tot++;}};f[0]=1;for(int i=1;i<=cnt;++i){for(int j=200000;j>=a[i].w;--j){f[j]=max(f[j],f[j-a[i].w]*a[i].p/100.0);}}for(int i=0;i<=200000;++i){ans=max(ans,f[i]*(orians+i));}printf("%.8Lf",ans);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/830639.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 AH CSP-S 迷惑行为大赏

洛谷专栏阅读:https://www.luogu.com.cn/article/0atx674s 一、概述 观前提示:本届CSP-S安徽省整活相较于其他省份不是那么“群英荟萃”,观看前请不要小零食(?) 本届CSP-S安徽共有1013人参赛,其中有效准考证号源文件夹共有1006个,7人因为种种原因最终没有留下任何参赛痕…

LeNet-5卷积神经网络的实现与改进-实验报告

摘要 在本次实验中,我实现了LeNet-5卷积神经网络模型的构建与训练,以实现图像分类任务。主模型采用Pytorch框架搭建,模型识别准确率达到了87%,体现了较好的分类效果。除此之外,我还尝试使用C++实现模型的底层核心操作,包括卷积、池化及全连接等,但最终准确率较低,未达预…

【Mplus 8.7软件下载与安装教程】

1、安装包 Mplus 8.7: 链接:https://pan.quark.cn/s/128e81c51dbe 提取码:1X7B Mplus 8.3: 链接:https://pan.quark.cn/s/5ea5ff583480 提取码:Vdjt Mplus 7.4: 链接:https://pan.quark.cn/s/414ec0c8cb14 提取码:8jhm 2、安装教程 1) 双击Mplus8.7 Demo(64-bi…

Day13 备战CCF-CSP练习

202312-3Day 13 题目描述 题目分析 大模拟,用栈储存每一个多项式,最后根据导数的加法原则依次求导相加,注意取模。 C++代码 #pragma GCC optimize(3, "Ofast", "inline") #include <bits/stdc++.h> #define int long longusing namespace std; co…

OOP实验三

任务1: 源码:1 #pragma once2 3 #include <iostream>4 #include <string>5 6 using std::string;7 using std::cout;8 9 // 按钮类 10 class Button { 11 public: 12 Button(const string &text); 13 string get_label() const; 14 void click()…

鸿蒙NEXT开发案例:转盘1W

【1】引言(完整代码在最后面) 在鸿蒙NEXT系统中,开发一个有趣且实用的转盘应用不仅可以提升用户体验,还能展示鸿蒙系统的强大功能。本文将详细介绍如何使用鸿蒙NEXT系统开发一个转盘应用,涵盖从组件定义到用户交互的完整过程。 【2】环境准备 电脑系统:windows 10 开发工…

开源 - Ideal库 - 常用时间转换扩展方法(二)Qv

合集 - Ideal库 - Common库(2)1.开源 - Ideal库 - 常用时间转换扩展方法(一)11-07:悠兔机场2.开源 - Ideal库 - 常用时间转换扩展方法(二)11-09收起 书接上回,我们继续来分享一些关于时间转换的常用扩展方法。01、时间转日期时间 TimeOnly 该方式是把TimeOnly类型转为Date…

存储器的知识

以W25Q256为例子(外部Flash),结构如下:扇区的内部结构以F10系列为例子 64位代表的是8个字节的数据,一个地址最多可以存储8个字节的数据(double数据类型就是8个字节),4k,16k,64k,32k代表的是地址的总数,主存储块又可以分为很多个页,页里面也有存储的空间大小嵌入式闪存的组成

什么是git,什么是github,git和github的使用

Git实战注意:本项目是学习笔记,来自于哔哩哔哩武沛齐老师的Git实战视频, 网址:【武沛齐老师讲git,看完绝对上瘾!!!】 https://www.bilibili.com/video/BV1ne4y1E7np/?share_source=copy_web&vd_source=2c9a5d5590d3759367594e264ff079c4另外,因为这个博客是我直接…

law Intermediate walkthrough pg

靶场很简单分数只有10分跟平常做的20分的中级靶场比确实简单 我拿来放松的 算下来30分钟解决战斗 nmap 扫到80端口web界面 是个框架 搜exp https://www.exploit-db.com/exploits/52023 他的脚本可能有点问题看不到回显 我们审脚本直接看到漏洞点所在 命令执行 curl -s -d "…

streamlit run执行报错,Invalid value: File does not exist: XXX.py

streamlit run执行报错,Invalid value: File does not exist: XXX.py 在终端执行 streamlit run xxx.py 的时候报错提示 Invalid value: File does not exist: XXX.py 网上众说纷纭,但是我个人的解决方法其实非常简单 在终端中执行的时候会发现中间多了个warning翻译过来就是…

03_muduo_base3

5.6 互斥锁和条件变量的封装 类图该类是封装了互斥锁的一些基本操作,包括互斥锁的初始化、销毁、上锁、解锁等功能。但是实际上使用RAII技术又封装了一个类,那就是MutexLockGuard。这主要也是采取了类似智能指针的封装思路,让互斥锁的生命周期交给操作系统去管理,释放的时机…