首页 > 其他分享 >P8162 [JOI 2022 Final] 让我们赢得选举 (Let's Win the Election) 题解

P8162 [JOI 2022 Final] 让我们赢得选举 (Let's Win the Election) 题解

时间:2024-11-11 20:08:43浏览次数:1  
标签:int 题解 db P8162 Let Win JOI Final

P8162 [JOI 2022 Final] 让我们赢得选举 (Let's Win the Election) 题解

朴素的想法是先抓一部分人,再一起去发表演讲。这样就要按 \(b\) 的值从小到大排序,枚举选择的一部分 \(b\) 值,在后面挑选一些最小的 \(a\) 选择即可。

但这样显然是错误的。观察到 \(n\le 500\),显然是 \(O(n^3)\) 的复杂度,但这样大致是 \(O(n^2)\) 的。考虑这样的策略会使什么情况不优。

注意到先抓人的策略一定没有问题,但问题出在抓的人不一定是按 \(b\) 值排序的前一部分。当一个 \(a\) 特别小的时候,我们完全可以不选 \(b\) 而去选 \(a\),抓完人之后补上选票即可。看上去这个东西不是很好操作,但是注意到前面的这一部分不选 \(b\) 的条件是选 \(a\),也就是说不论怎样都会获得选票,于是考虑枚举最后一个抓人的点,抓人的点之前的部分一定是选择 \(a/b\),对于记录抓人个数可以用容易的 \(O(n^2)\) dp 实现;对于后面的部分预处理最小值即可。时间复杂度是 \(O(n^3)\) 的。

代码:

#include <bits/stdc++.h>
#define db double
#define N 505
using namespace std;
int n, k;
struct Node {
	db a, b;
	bool operator < (const Node &x) const {
		return b < x.b;
	}
} e[N];
db dp[N][N];
void ck(db &x, db y) {
	x = min(x, y);
}
db ans = 1e9;
db sum[N][N];
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		cin >> e[i].a >> e[i].b;
		if (e[i].b == -1) e[i].b = 1e9;
	}
	sort(e + 1, e + 1 + n);
	for (int i = 0; i <= n; i++) {
		vector<db>v;
		v.push_back(-1);
		for (int j = i + 1; j <= n; j++)
			v.push_back(e[j].a);
		sort(v.begin(), v.end());
		int l = v.size();
		for (int j = 1; j <= l; j++)
			sum[i][j] = sum[i][j - 1] + v[j];
	}
	for (int nb = 0; nb <= n; nb++) {
		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++)
				dp[i][j] = 1e9;
		dp[0][0] = 0;
		for (int i = 0; i < n; i++)
			for (int j = 0; j <= min(i, nb); j++)
				if (dp[i][j] < 1e9) {
					ck(dp[i + 1][j], dp[i][j] + e[i + 1].a / (nb + 1));
					ck(dp[i + 1][j + 1], dp[i][j] + e[i + 1].b / (j + 1));
				}
		for (int i = 0; i <= n; i++)
			ck(ans, dp[i][nb] + sum[i][k - i] / (nb + 1));
	}
	printf("%.10lf\n", ans);
	return 0;
}

标签:int,题解,db,P8162,Let,Win,JOI,Final
From: https://www.cnblogs.com/Rock-N-Roll/p/18540471

相关文章

  • libwebp在windows下构建及编译运行
    因为正在进行WEBP图像的学习,因此有必要对WEBP的官方实现——libwebp进行本地构建和编译,以方便对标准及代码的理解。下面记录一下,在本地Windows电脑上,构建并编译libwebp的过程。步骤一:下载源码首先,获取libwebp的最新源码:从官方Git仓库克隆:gitclonehttps://chromium......
  • 常见 setup.exe 参数 有关 Setup 命令行参数的其他信息,请参阅 Setup Help 文件。有
    Windows安装程序安装或升级Windows。Setup.exe[/debughelp][/auto<upgrade;dataonly;clean>][/quiet][/installdrivers<driver_folder_path>][/noreboot][/installangpacks<language_packfolder_path>][/showoobe<none;full>][/unattend:<ans......
  • YOLO11+Anacoda+Win环境配置CPU版
    一、所需软件Anacoda和Pycharm1.Anacoda建议用清华大学的源进行安装。Indexof/anaconda/archive/|清华大学开源软件镜像站|TsinghuaOpenSourceMirror2.Pycharm安装比较简单,自行安装即可。二、创建虚拟环境建议先换源。condaconfig--remove-keychannelscon......
  • 推荐一款Windows卸载工具:
    GlaryAbsoluteUninstaller类似于标准的Windows添加/删除程序,但功能更强大。标准的添加/删除程序无法完全卸载应用程序,这通常会在硬盘上留下损坏的注册表项和不需要的文件。您的计算机拥有的垃圾文件越多,运行速度就越慢。AbsoluteUninstaller可以在几秒钟内清除所有垃圾文件......
  • win 11 开发板,windows,ubuntu虚拟机网络互通
    确保在同一个网段里面就行如果ping开发板不通,将win防火墙关闭了试一试虚拟机使用桥接模式,桥接到正确的网卡上,此处使用的是usb网卡编辑->虚拟机网络编辑器ubuntu手动设置桥接的网卡信息此处ens32是桥接的网卡ens33是NAT网卡windows也是同样设置,注意网段保持一致虚拟......
  • 标题:Windows系统启动流程
      Windows的启动过程包括以下几个阶段: 一,启动自检阶段 这个阶段主要是读取 BIOS ,然后内存,CPU,硬盘,键盘等设备进行自检。这个阶段在屏幕上显示就是自检的那些打印信息。在打开计算机电源时,首先开始电源启动自检过程。在BIOS中包含一些基本的指令,能够帮助计算机在没有......
  • 题解:P11062 【MX-X4-T2】「Jason-1」加法
    一道简单的分讨。思路可分成两种情况。当\(a\)和\(b\)同号时:这种情况,显而易见的是\(|a-b|\)的最小值必定是\(|a|,|b|,|a-b|\)之一。当\(a\)和\(b\)异号时:对\((a,b)\)执行欧几里得算法可以将一个变为\(0\),另一个变为\(\gcd(a,b)\)(忽略正负号)。再将\(0\)变......
  • 题解:P10967 [IOI2000] 邮局(原始版)
    思路首先将坐标排序。定义\(dp_{i,j}\)为前\(i\)个村庄放\(j\)个邮局的前\(i\)个村庄的最小距离总和,\(f(i,j)\)表示村庄区间\([i,j]\)内放一个村庄时该区间的总和。转化式易得\(dp_{i}{j}=dp_{k}{j-1}+f(k+1,i),k\in[0,i)\)。则本题的难点就为求\(f(k-1,i)\)。......
  • 题解:UVA1362 Exploring Pyramids
    思路:显然的,若不是叶子结点都应该至少遍历两次。于是两个相同访问之间就可能是一颗子树。更加具体的,如同\(s_l,\dots,s_k,\dots,s_r\),使得\(s_l=s_k\),那么就可以认为\(s[l,k]\)是\(s[l,r]\)的一颗子树,设区间\(s[l,r]\)的结构数量为\(f_{l,r}\),那么根据乘法原理,当把\(......
  • 241111 noip 题解
    省流:\(100+50+10+30\)。还是不稳定啊,noip上不了270就真的要退役了。T1题意:给定一个长度为\(n\)的序列\(a\),每次你可以交换相邻两个位置,求出最小交换次数以及字典序最小的交换方案使得\(a\)的每个不是本身的前缀都不是排列。\(n\leq10^5\)。注意到每次交换至多会减少一......