首页 > 其他分享 >洛谷 P8162

洛谷 P8162

时间:2022-10-13 22:22:21浏览次数:60  
标签:right 洛谷 int P8162 选票 赢得 协作者

考虑我们的决策肯定是先按 \(B_i\) 大小在几个州赢得协作者,然后再在剩下的几个州里赢得选票。

下文记 \(S\) 为赢得协作者的州的集合,\(T\) 为赢得选票的州的集合。

按 \(B_i\) 从小到大排序后,对于一个前缀 \(i\) 来说,如果 \(i\) 是编号最大的赢得协作者的州,那么对于每个 \(j(j<i)\),要么 \(j\in S\),要么 \(j\in T\)。

证明的话就考虑如果前面有一个州既没赢得协作者也没赢得选票,那么可以在 \(S\) 中删去 \(i\),加入 \(k\),不难发现这样调整后变得更优了。

于是我们可以枚举 \(S\) 的大小,然后对于每个后缀 \(i\) 先求出要赢得 \(j\) 张选票的最小代价,对于每个前缀 \(i\) 去 DP 一下选 \(\left|S\right|\) 个赢得协作者的州和 \(i-\left|S\right|\) 赢得选票的州的最小代价,然后合并即可。

时间复杂度为 \(\mathcal O(n^3)\)。

具体细节看代码。

Code:

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef pair <int, int> pii;
const int N = 505;
int n, K;
pii a[N], b[N];
double f[N][N], g[N][N];
double ans = 1e9;

int main() {
	scanf("%d%d", &n, &K);
	for (int i = 1; i <= n; ++i) {
		scanf("%d%d", &a[i].fi, &a[i].se);
		if (a[i].se == -1) a[i].se = 1e9;
	}
	sort(a + 1, a + n + 1, [](pii x, pii y) {
		return x.se < y.se;
	});
	memcpy(b, a, sizeof b);
	for (int i = n; i; --i) {
		sort(a + i, a + n + 1, [](pii x, pii y) {
			return x.fi < y.fi;
		});
		for (int j = i; j <= n; ++j) g[i][j - i + 1] = g[i][j - i] + a[j].fi; 
	}
	memcpy(a, b, sizeof a);
	for (int k = 0; k <= K; ++k) {
		for (int i = 0; i <= K; ++i)
			for (int j = 0; j <= k; ++j)
				f[i][j] = 1e9;
		f[0][0] = 0;
		for (int i = 1; i <= K; ++i) {
			f[i][0] = f[i - 1][0] + 1.0 * a[i].fi / (k + 1);
			for (int j = 1; j <= k; ++j) f[i][j] = min(f[i - 1][j - 1] + 1.0 * a[i].se / j, f[i - 1][j] + 1.0 * a[i].fi / (k + 1));
		}
		for (int i = 0; i <= K; ++i) ans = min(ans, f[i][k] + g[i + 1][K - i] / (k + 1));
	}
	printf("%.8lf", ans);
	return 0;
}

标签:right,洛谷,int,P8162,选票,赢得,协作者
From: https://www.cnblogs.com/Kobe303/p/16789958.html

相关文章

  • 洛谷 P4035
    #include<bits/stdc++.h>usingnamespacestd;constintN=250;intn;doublea[N][N],x[N],p[N][N],q[N][N];voidgauss(){for(inti=1;i<=n;i+......
  • 在洛谷水的时候找到了一只批, 所以贺了亿点图
    希望他不删掉下面是德狗......
  • 洛谷 P8569 [JRKSJ R6] 第七学区
    洛谷传送门好题,吹爆JRKSJ!考虑朴素的\(O(n\logV)\)做法。枚举第\(i\)位,需要计算所有极长连续的全\(0\)区间长度,答案为\(\sum\limits_{i=0}^{63}2^i\times(\f......
  • 【洛谷】P8256 [NOI Online 2022 入门组] 字符串(dp)
    原题链接题意给定两个由0,1,-组成的字符串\(S\),\(T\),以及一个空串\(R\)。\(S\)的长度为\(n\)。现在要进行\(n\)次操作,每一次操作取出\(S\)的第一个字符\(c\)......
  • 洛谷 P2766【网络流】【线性DP】
    摘自网络流\(24\)题官方题解。第一问:直接\(O(n^2)\)DP求解最长不下降子序列即可。第二问:使用类似于酒店之王的思想,将点\(i\)拆成两个点\(i_1\),\(i_2\)。然后......
  • 洛谷 P8572【暴力】【根号分治】
    根号分治。需要进行分类讨论:当\(n\lek\)的时候,可以进行暴力\(\#1\):暴力求出数组所有区间的最大值。(需要使用前缀和)否则,可以使用一个叫做“记忆化”的鬼玩意。如......
  • 洛谷P4320 道路相遇(LCA+圆方树)
    题目链接:https://www.luogu.com.cn/problem/P4320道路相遇题目描述在H国的小w决定到从城市$u$到城市$v$旅行,但是此时小c由于各种原因不在城市$u$,但是小c决......
  • 洛谷 P3488 [POI2009]LYZ-Ice Skates 题解
    错解每次跑二分图匹配,时间复杂度显然爆炸。时间复杂度:我被杀手皇后摸过了正解引入Hall定理:设二分图中\(G=<V_1,V_2,E>,|V_1|\le|V_2|\),则G中存在\(V_1\)到......
  • 洛谷 P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索
    题目https://www.luogu.com.cn/problem/P3067思路考虑折半搜索,第一个dfs对[1,n/2]的数进行分组,+代表第一组,-代表第二组,并计算两组总和的情况方案数\(a_i\)。第二个dfs......
  • 洛谷 P3530 / bzoj2788【tarjan】【差分约束】
    判断是否有解可以使用差分约束。求解赛车手的成绩的取值可以使用Floyd。但是\(O(n^3)\)会TLE。可以先进行一次缩点。然后进行Floyd求出每一个连通块内的最长路径......