首页 > 其他分享 >P8162 [JOI 2022 Final] 让我们赢得选举

P8162 [JOI 2022 Final] 让我们赢得选举

时间:2024-03-29 13:12:07浏览次数:21  
标签:std int 复杂度 类州 P8162 2022 JOI dp 贪心

P8162 [JOI 2022 Final] 让我们赢得选举

贪心+dp

题目要求最小耗时,可以考虑贪心和dp。

先考虑贪心。首先,假如我们此时有 \(b\) 个州得到了选票和协作者,那么下一次演讲一定是 \(b\) 个协作者和自己一起去同一个州演讲,时间为 \(\frac{a_i/b_i}{b+1}\),这样我们的时间一定不会浪费掉。

接下来,若我们已经知道了方案,此时已知每个州是得到选票(\(A\) 类)、得到选票+协作者(\(B\) 类)、不演讲(\(C\) 类)中的一种,我们又可以继续贪心。设有 \(b\) 个 \(B\) 类州,那么我们一定是按从小到大的顺序最先得到所有 \(B\) 类州, \(A\) 类点的答案就是 \(\sum \frac{a_i}{b+1}\)(只受 \(b\) 的影响),这样做时间一定最短。

于是启发我们把序列按 \(b_i\) 从小到大排序,这样在考虑到第 \(i\) 个是 \(B\) 类州时,不会受到后面的影响。接下来可以枚举 \(b\),对每个 \(b\) 求解。考虑 dp。

设 \(f_{i,j,k}\) 表示考虑到第 \(i\) 个,有 \(j\) 张选票,有 \(k\) 个协作者的最小时间。转移显然。那么 dp 的复杂度是 \(O(n^3)\),加上枚举的 \(b\),总复杂度是 \(O(n^4)\)。

考虑优化,继续贪心, 我们两个 \(B\) 类州之间有 \(C\) 类州,那么我们可以把右端的 \(B\) 类州与之间任意 \(C\) 类州互换,这样一定不差。以此类推就有 \(B\) 类州之间不存在 \(C\) 州,且序列最左端也不会有 \(C\) 类州。于是我们可以把序列分成两部分,左部分全是 \(A\) 或 \(B\) 类,右部分一定是 \(A\) 类或 \(C\) 类。如果我们只对左部分 dp,就可以省去 \(j\) 这一维了(因为左部分都有选票)。枚举断点 \(i\),显然右部分的答案就是 \([i+1,n]\) 中选 \(k-i\) 个 \(a_i\) 的最小和,这个也可以用背包 \(O(n^2)\) 处理。于是每个 \(b\) 的答案就是 \(\min_{i=1}^n(f(i,b)+\frac{g(i+1,k-i)}{b+1})\)。dp 复杂度降到 \(O(n^2)\),总复杂度是 \(O(n^3)\)。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_back

typedef long long i64;
const int N = 510;
int n, k;
struct node {
	int a, b;
} a[N];
bool cmp(node a, node b) {
	return a.b < b.b;
}
double f[N][N], g[N][N];
void Solve() {
	std::cin >> n >> k;

	int B = 0;
	for(int i = 1; i <= n; i++) {
		std::cin >> a[i].a >> a[i].b;
		if(a[i].b != -1) B++;
		a[i].b = ((a[i].b == -1) ? 0x3f3f3f3f : a[i].b);
	}

	std::sort(a + 1, a + n + 1, cmp);
	double ans = 0x3f3f3f3f;
	for(int i = 1; i <= n + 1; i++) {
		for(int j = 1; j <= n + 1; j++) g[i][j] = 600000;
	}
	for(int i = 1; i <= n + 1; i++) g[i][0] = 0;
	for(int i = n; i >= 1; i--) {
		for(int j = 1; j <= n - i + 1; j++) {
			g[i][j] = 600000;
			g[i][j] = std::min(g[i][j], g[i + 1][j]);
			g[i][j] = std::min(g[i][j], g[i + 1][j - 1] + a[i].a);
		}
	}
	for(int b = 0; b <= std::min(B, k); b++) {
		for(int i = 0; i <= n; i++) {
			for(int j = 0; j <= n; j++) f[i][j] = 600000;
		}
		f[0][0] = 0;
		for(int i = 1; i <= k; i++) {
			for(int j = 0; j <= b; j++) {
				f[i][j] = std::min(f[i][j], f[i - 1][j] + (double)(1.0 * a[i].a / (b + 1)));
				if(j - 1 >= 0) f[i][j] = std::min(f[i][j], f[i - 1][j - 1] + (double)(1.0 * a[i].b / j));
			}
		}
		for(int i = b; i <= k; i++) {
			ans = std::min(ans, f[i][b] + (double)(1.0 * g[i + 1][k - i] / (b + 1)));
		}
	}
	printf("%.15lf\n", ans);
}
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	Solve();

	return 0;
}

标签:std,int,复杂度,类州,P8162,2022,JOI,dp,贪心
From: https://www.cnblogs.com/FireRaku/p/18103615

相关文章

  • Flink:流式 Join 类型 / 分类 盘点
    博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手......
  • 蓝桥杯 2022 省A 选数异或
    一种比较无脑暴力点的方法,时间复杂度是(n²+m)。(注意==的优先级比^高,记得加括号(a[i]^a[j])==x)#include<iostream>#include<vector>#include<bits/stdc++.h>//包含一些C++标准库中未包含的特定实现的函数的头文件usingnamespacestd;intmain(){intn,......
  • 2022 Tesla AI Day -特斯拉自动驾驶FSD的进展和算法软件技术之数据以及虚拟
    2022TeslaAIDay-特斯拉自动驾驶FSD的进展和算法软件技术之数据以及虚拟附赠自动驾驶学习资料和量产经验:链接人工智能算法犹如电影的主演,我们很多时候看电影只看到主演们的精彩,但其实电影的创意和呈现都来自于背后的导演和制片等团队。而人工智能算法背后的有关数据的软件,设......
  • 【专题】2022年中国制造业数字化转型研究报告PDF合集分享(附原数据表)
    报告链接:http://tecdat.cn/?p=32145本文中所说的制造业数字化转型,指的是在制造企业的设计、生产、管理、销售及服务的每一个环节中,将新一代信息技术应用到制造企业的设计、生产、管理、销售及服务的每一个环节中,并可以以每一个环节中产生的数据为基础,展开控制、监测、检测、预测......
  • 中国500米逐年植被净初级生产力(NPP)数据集(2000-2022)
      净初级生产力(NPP)是指植物在单位时间单位面积上由光合作用产生的有机物质总量中扣除自养呼吸后的剩余部分,是生产者能用于生长、发育和繁殖的能量值,反映了植物固定和转化光合产物的效率,也是生态系统中其他生物成员生存和繁衍的物质基础。其中涉及的主要参量包括光和有效......
  • P8792 [蓝桥杯 2022 国 A] 最大公约数
    #include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;constintN=1e5+5;intgcd(intx,inty){re......
  • 在 Windows Server 2022 系统中,你可以使用一些组合命令结合系统自带的工具来实现文件
    在WindowsServer2022系统中,你可以使用一些组合命令结合系统自带的工具来实现文件夹同步。以下是一个示例组合命令,结合Robocopy和TaskScheduler来实现文件夹同步:使用Robocopy进行文件夹同步:Robocopy是Windows自带的一个命令行工具,用于复制大量文件和文件夹。你可......
  • 吴恩达2022机器学习专项课程(一) 4.1 梯度下降
    问题预览1.梯度下降算法的作用是?2.梯度下降如何计算线性回归的成本函数?3.所有的成本函数都是一个形状吗?4.在非凸形状中,梯度下降的更新过程是?5.在非凸形状中,不同的初值对最小化成本函数的影响是?6.什么是局部最小值?笔记1.梯度下降算法的作用梯度下降算法可以计算大多......
  • VS2022软件打包 生成和事后事件处理
    VS2022软件打包生成和事后事件处理 示例目标:将编译后的文件拷贝到新的文件,并重命名方便软件打包 生成前:删除目标目录:rd/s/q"$(SolutionDir)..\setup\$(ConfigurationName)\"生成后-拷贝重命名:copy"$(TargetPath)"$(TargetDir)JCZX-2024.exe"copy"$(TargetPat......
  • P8819 [CSP-S 2022] 星战 (很厉害的随机化想法)
    简化下题意有n个点m条单向边每条边有激活和失活两种状态,一共有4中操作1.失活一条u->v的边2.失活终点是v的边3.激活u->v的边4.激活终点是v的边问你每次修改后每个点的出度是否都为1.50分的做法就是暴力修改,对于1操作和3操作都是可以o(1)解决,对于2操作和4......