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

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

时间:2024-11-21 21:55:55浏览次数:1  
标签:frac mathit int 题解 Let Win dp

[JOI 2022 Final] 让我们赢得选举 (Let's Win the Election) / 選挙で勝とう (Let's Win the Election)

首先由

\[\min\left(\frac ab,\frac cd\right)\le\frac{a+c}{b+d}\le\max\left(\frac ab,\frac cd\right) \]

得出,集中力量办大事,得到的支持者一定要和本人在同一州进行演讲。第二,为了尽量节约时间,在一个州的演讲时间只可能是 \(\boldsymbol{0,A_i,B_i}\) 三者之一。第三,一定是先演讲获得所有支持者

所以有一个贪心:先将 \(B_i\) 为第一关键字、\(A_i\) 为第二关键字排序,贪心地选取。

但是会有一个问题:有些州 \(A_i\) 和 \(B_i\) 相差很大,我们舍弃 \(B_i\) 只演讲 \(A_i\) 的时间会更优。

这就不能靠贪心了,需要 DP。设 \(\mathit{dp}_{i,j}\) 为第 \(i\) 个州支持者数量为 \(j\) 时的答案,枚举 \(i\) 和支持者数量 \(j\),对于前 \(i-1\) 个肯定要么选 \(A_i\),要么选 \(B_i\)。有转移方程:

\[\mathit{dp}_{i,j}=\min\left(\mathit{dp}_{i-1,j}+\frac{A_i}{x+1},\mathit{dp}_{i-1,j-1}+\frac{B_i}j\right) \]

其中 \(x\) 为总的支持者数量。结合代码理解。

#include<bits/stdc++.h>
using namespace std;

constexpr int MAXN=505;
int n,k,a[MAXN];
double ans=2e18,f[MAXN][MAXN];
struct P{
	double a,b;
	bool operator<(const P&x)const{
		return b<x.b;
	}
}p[MAXN];
double min(double a,double b){
	return a<b?a:b;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	cin>>n>>k;
	for(int i=1;i<=n;++i){
		cin>>p[i].a>>p[i].b;
		if(p[i].b==-1) p[i].b=2e18;
	}
	sort(p+1,p+n+1);
	for(int x=0;x<=k;++x){
		for(int i=1;i<=n;++i) a[i]=p[i].a;
		for(int i=0;i<=n;++i)
			for(int j=0;j<=n;++j)
				f[i][j]=2e18;
		f[0][0]=0;
		double res=2e18;
		for(int i=1;i<=n;++i)
			for(int j=0;j<=min(x,i);++j){
				f[i][j]=f[i-1][j]+p[i].a/(x+1);
				if(j&&p[i].b<2e18) f[i][j]=min(f[i][j],f[i-1][j-1]+p[i].b/j);
			}
		for(int i=k;i<=n;++i) res=min(res,f[i][x]);
		for(int i=k;i>=x;--i){
			sort(a+i+1,a+n+1);
			double sm=0;
			for(int j=i+1;j<=k;++j) sm+=a[j];
			res=min(res,f[i][x]+sm/(x+1));
		}
		ans=min(ans,res);
	}
	cout<<fixed<<setprecision(15)<<ans<<'\n';
	return 0;
}

标签:frac,mathit,int,题解,Let,Win,dp
From: https://www.cnblogs.com/laoshan-plus/p/18561640

相关文章

  • [COCI2015-2016#6] PAROVI | 互质覆盖 题解
    前言不能在同一个坑上栽第三次!题目链接:原题;加强版。题意简述\(1\simn\)数轴,你可以使用若干条线段\([l,r]\)来覆盖,其中要满足\(\gcd(l,r)=1\)。问你能够完全覆盖数轴的方案数,对\(M\)取模。\(2\leqn\leq10^4\),\(2\leqM\leq10^9+7\)。不保证\(M\)为质数。......
  • 【C#应用】Windows Forms 自定义仪表盘控件开发
    本教程将详细介绍如何在WindowsForms中创建一个自定义的仪表盘控件。这个控件具有以下特性:可配置的颜色区间平滑的动画效果可自定义的外观刻度和数值显示设计时支持,这个以前没咋研究过,有点尴尬了。。先看一下效果以前一直没有认真的实现过控件集合编辑,发现这块还......
  • win10同时安装jdk8和jdk17
    如图,新建3个变量,复制路径。需要用哪个版本,就改JAVA_HOME中的数字即可。        ......
  • 【C#应用】C# 对 Windows API 内存操作
    在C#中,我们可以通过调用WindowsAPI来进行内存操作,这在一些特定的场景下非常有用。比如在需要与底层系统进行交互、进行内存分配和释放、修改其他进程的内存等情况下,使用WindowsAPI可以帮助我们实现这些功能。应用场景内存分配和释放通过WindowsAPI可以实现内存的动态分配和......
  • windows基础二
    Windows2声明!学习视频来自B站up主泷羽sec有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站......
  • 【题解】AT_joisc2007_mall ショッピングモール (Mall)
    原题传送门温馨提示:岛国题要换行!需要求一个矩阵的和,考虑二维前缀和。题目中不允许矩阵中有负数,结合求和的最小值,我们把负数赋为最大值不就行了吗。接下来就是求二维前缀和了。基于容斥原理,二维前缀和有如下递推关系:\[sum_{i,j}=sum_{i-1,j}+sum_{i,j-1}-sum_{i-1,j-1}+c_{i......
  • 【题解】AT_agc011_b [AGC011B] Colorful Creatures
    原题传送门我们知道,要想使一个生物能活到最后,那么它进行的每一次吸收前,它的大小应当尽可能大,所以我们考虑贪心,对生物的大小从小到大排序,每个生物都从小的开始吸收,看能不能活到最后,时间复杂度\(\mathcal{O(n^2)}\)。我们还知道,排序后,生物\(i\)能活到最后,则生物\(i+1\simn\)......
  • MagicQuill,AI动态图像元素修改,AI绘图,需要40G的本地硬盘空间,12G显存可玩,Win11本地
    最近由magic-quill团队开源的MagicQuill项目十分引人瞩目,这个项目可以通过定制的gradio客户端针对不同的图像元素通过提示词进行修改,从而生成新的图像。值得一提的是,这个项目相当亲民,只需要20步迭代模型预测,甜品卡10秒钟就可以获取图片的修改效果,但是代价是至少需要40个G左......
  • 【Windows安全】使用C#调用系统Windows Win32 API注册表操作
    在C#中,我们可以使用WindowsWin32API来对系统注册表进行操作。注册表是Windows操作系统中用来存储配置信息的重要数据库,我们可以通过C#来读取、写入和删除注册表中的键和值。下面是一些使用C#调用系统WindowsWin32API注册表操作的示例:读取注册表键值RegOpenKeyEx用于打开指......
  • xlwings模块的日常使用
    Python的xlwings模块经常用来操作xlsx文档,是办公党比较常用的。下面就是一个示例,从文件A.xlsx中读取一些数据,在B.xlsx中做筛选,然后保存到C.xlsximportxlwingsasxwfileA=r"A.xlsx"fileB=r"B.xlsx"fileC=r"C.xlsx"app=xw.App(visible=False,add_book=False)app......