Wannafly挑战赛7 D - codeJan与青蛙
输入描述:
第一行一个正整数T≤20表示测试组数。每组测试样例的第一行是两个正整数n,m,分别表示存在青蛙的位置和可以放置黑洞的数量。接下来n行,每行包含两个正整数a[i],b[i]分别表示第i组青蛙的位置(单位:米)和这个位置上青蛙的数量。
输出描述:
对于每组测试用例用一行输出两个正整数分别表示最少可以听到多少声WA和黑洞的最少容量。用空格隔开,行末无空格。
输入
2
3 1
1 1
2 2
3 3
3 2
1 1
4 2
2 3
输出
8 6
3 4
说明
对于第一个样例,只能放在 1 位置,因此听到的 WA 的次数为:1*0+2*1+3*2=8,所有青蛙汇聚在一次,容量至少为 6。
对于第二个样例,可以放在 1 和 4 位置,因此听到的 WA 的次数为:1*0+3*1+2*0=3,1 位置和 2 位置的青蛙汇聚在一 起,需要容量为 4;4 位置的青蛙单独在一起,需要容量为 2。因此容量至少为 4
备注:
输入保证a[i] ≠a[j](i ≠j),1≤m≤n≤100,1≤a[i],b[i]≤106。
题解
$dp$,二分。
$dp[i][j]$表示到$i$位置,分了$j$段的最小花费,每一个区间的花费可以预处理。
$dp[1][m]$就是第一个答案。
对于第二个答案,容量越大,最小花费肯定越小,容量越小,最小花费越大,利用这个单调性就可以二分,假设二分到的容量为$x$,那么$dp$的时候外加一个条件控制一下区间和要小于等于$x$。
#include <bits/stdc++.h>
using namespace std; const int maxn = 100 + 10;
int T, n, m;
struct X {
int a, b;
}s[maxn];
long long cost[maxn][maxn];
long long dp[maxn][maxn];
long long sum[maxn][maxn];
long long limit; bool cmp(const X& a, const X& b) {
return a.a < b.a;
} int check(long long mid) {
for(int i = 1; i <= n; i ++) {
dp[i][1] = 1e18;
if(sum[i][n] <= mid) dp[i][1] = cost[i][n];
}
for(int j = 2; j <= m; j ++) {
for(int i = n - j + 1; i >= 1; i --) {
dp[i][j] = 1e18;
for(int k = i + 1; k <= n; k ++) {
if(dp[k][j - 1] != 1e18 && sum[i][k - 1] <= mid) {
dp[i][j] = min(dp[i][j], dp[k][j - 1] + cost[i][k - 1]);
}
}
}
}
if(limit == dp[1][m]) return 1;
return 0;
} int main() {
scanf("%d", &T);
while(T --) {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++) {
scanf("%d%d", &s[i].a, &s[i].b);
}
sort(s + 1, s + 1 + n, cmp);
for(int i = 1; i <= n; i ++) {
for(int j = i; j <= n; j ++) {
cost[i][j] = cost[i][j - 1] + 1LL * (s[j].a - s[i].a) * s[j].b;
sum[i][j] = sum[i][j - 1] + s[j].b;
}
}
for(int i = 1; i <= n; i ++) dp[i][1] = cost[i][n];
for(int j = 2; j <= m; j ++) {
for(int i = n - j + 1; i >= 1; i --) {
dp[i][j] = 1e18;
for(int k = i + 1; k <= n; k ++) {
dp[i][j] = min(dp[i][j], dp[k][j - 1] + cost[i][k - 1]);
}
}
}
limit = dp[1][m];
long long ans2 = sum[1][n];
long long L = 1, R = ans2;
while(L <= R) {
long long mid = (L + R) / 2;
if(check(mid)) ans2 = mid, R = mid - 1;
else L = mid + 1;
}
printf("%lld %lld\n", limit, ans2);
}
return 0;
}
Wannafly挑战赛7 D - codeJan与青蛙的更多相关文章
- Wannafly挑战赛7 B - codeJan与旅行
题目描述 codeJan 非常喜欢旅行.现在有 n 个城市排在一条线上,并且 codeJan 的位置不和任何一个城市的位置重叠.codeJan 想要游览 m 个城市,同时因为时间是不断变化的,游览一个 ...
- Wannafly挑战赛25游记
Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...
- Wannafly挑战赛27
Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- Wannafly挑战赛21A
题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...
- Wannafly挑战赛24游记
Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...
- Wannafly挑战赛25C 期望操作数
Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...
- Wannafly挑战赛18B 随机数
Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...
- Wannafly挑战赛22游记
Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...
随机推荐
- spring整合hibernate时报错:org.hibernte.engine.transaction.spi.transactioncontext
错误提示:Caused by:java.lang.ClassNotFoundException: org.hibernte.engine.transaction.spi.transactioncont ...
- Ajax笔记-加强版
AJAX : Asynchronous JavaScript and XML 异步JavaScript和XML 用javascript异步形式去操作xml 进行数据交互 节省用户操作,时间 ...
- CF745 C 并查集
并查集由于政府不能连通我们可以先按给出的边建立连通块,再将不含有政府的点全部作为一个连通块,边数为(n-1)*n/2然后 贪心地将该连通块与[含政府的.且包含点数最多的]连通块相连,然后由于新增了一些 ...
- Spring Boot中使用Spring Security进行安全控制
我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...
- 论文里有公式?用texlive+texstudio(windows下)
要写论文了,但论文里有一大堆公式,感觉很麻烦,经过询问同学知道有tex这么个东西,可以像写代码一样写论文,许多论文的格式都有相关的模板,所以学习一下,这里记录一下环境安装. texlive和texst ...
- mongoose使用简记
mongodb中集合相当于表,常用指令 mongo 进入数据库 use yourdatabase 来选择你的数据集,这个跟关系型中的一样 show collections 来查看你数据集中的表,col ...
- JWT 拓展
JWT适用场景 https://www.jianshu.com/p/af8360b83a9f 适用于一次性操作的认证,颁布一个很短过期时间的JWT给浏览器. 无状态的JWT无法实现精确的在线人数统计. ...
- Vmware安装ubuntu详细教程
1.环境准备: (1) 范例系统为WIN10 64位家庭普通版,已正确安装虚拟机VMware Workstation 12 Pro.(2) 下载Ubuntu系统. 2.安装过程: 2.1 VMware ...
- python简单爬虫一
简单的说,爬虫的意思就是根据url访问请求,然后对返回的数据进行提取,获取对自己有用的信息.然后我们可以将这些有用的信息保存到数据库或者保存到文件中.如果我们手工一个一个访问提取非常慢,所以我们需要编 ...
- stegsolve使用探究
应该也不是工具的问题吧,更多的是图片.但是不知道咋取就写工具了. 比如:http://ctf5.shiyanbar.com/stega/chromatophoria/steg.png 我在想为毛要选择 ...