【BZOJ】4985: 评分【DP】
4985: 评分
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 148 Solved: 75
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
5 2
5 5
8 6
6
2
8
9
Sample Output
//最高得分的评分排列:2, 5, 6, 8, 5, 8, 9
Solution
这道题太巧妙了丫!
核心思想是二分+dp统计答案。
如何判断答案是否合法?我们的目的是让最后剩下的那个大于等于二分的$mid$。用一个$f[i]$表示让前$n$个第$i$个位置合法,之前最少需要多少个剩下$n-m$个中合法的但不确定的来补。
所以一开始如果是确定的并且$>=mid$,那么$f$值是0,如果确定但$<mid$,$f$值是inf。如果不确定,那么就是1(在这个位置放一个合法的)
把以上按顺序放到一个队列里,然后模拟删除操作即可。因为我们要使转移后的也合法,那么每次三个中至少有两个合法(最高的和它自己),所以每次在队列前三个中两两和取$min$入队即可。(转移当前需要至少多少个来补)
最后判断一下最后剩下的这个$f$是不是小于等于不确定位置中符合条件的数量即可。
Code
#include<bits/stdc++.h>
#define oo 0x3f3f3f3f
using namespace std; int b[], G[], n, m;
bool check(int mid) {
queue < int > q;
int tot = ;
for(int i = ; i <= n - m; i ++) if(b[i] >= mid) tot ++;
for(int i = ; i <= n; i ++) {
if(!G[i]) q.push();
else if(G[i] >= mid) q.push();
else q.push(oo);
}
while(q.size() > ) {
int x1 = q.front(); q.pop();
int x2 = q.front(); q.pop();
int x3 = q.front(); q.pop();
q.push(min(min(x1 + x2, x1 + x3), min(x2 + x3, oo)));
}
if(q.front() <= tot) return ;
return ;
} int erfen() {
int l = , r = oo, ans;
while(l <= r) {
int mid = (l + r) >> ;
if(check(mid)) ans = mid, l = mid + ;
else r = mid - ;
}
return ans;
} int main() {
scanf("%d%d", &n, &m);
for(int i = ; i <= m; i ++) {
int a, b;
scanf("%d%d", &a, &b);
G[b] = a;
}
for(int i = ; i <= n - m; i ++) scanf("%d", &b[i]);
int ans = erfen();
printf("%d", ans);
return ;
}
【BZOJ】4985: 评分【DP】的更多相关文章
- BZOJ 4985: 评分
二分答案 >=key的记为1 f[i]表示令i位置为1所需要的最少的1的个数 队列模拟 #include<cstdio> #include<algorithm> usin ...
- BZOJ.2655.calc(DP/容斥 拉格朗日插值)
BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...
- BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)
BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...
- BZOJ 1040 树形DP+环套树
就是有n个点n条边,那么有且只有一个环那么用Dfs把在环上的两个点找到.然后拆开,从这条个点分别作树形Dp即可. #include <cstdio> #include <cstrin ...
- bzoj 3851: 2048 dp优化
3851: 2048 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 22 Solved: 9[Submit][Status] Description T ...
- BZOJ 1068 (区间DP)
题意:字符串的压缩,f[l][r][0]代表还没M,f[l][r][1]代表有M. #include<cstdio> #include<cmath> #include<c ...
- BZOJ 4321: queue2( dp )
dp(i, j, 1)表示前i个, 有j对是不合法的, i和i-1是在一起的. dp(i, j, 0)表示前i个, 有j对是不合法的, i和i-1不在一起的. 转移我们只需考虑是多了一对不合法的还是少 ...
- BZOJ 3156: 防御准备( dp + 斜率优化 )
dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...
- BZOJ.4361.isn(DP 树状数组 容斥)
题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...
随机推荐
- Css中实现一个盒子固定宽度,另一个盒子宽度自适应的方法
Css中实现一个盒子固定宽度,另一个盒子宽度自适应的方法 网上方法很多,个人认为以下两种思想是最为常用的. 一种是让第一个盒子脱离文档流,第二个盒子离左边有一定距离. 第二种方法是使用flex布局,不 ...
- margin-bottom无效问题以及div里内容动态居中样式!
最近调前端样式时候,遇到一个需求,在中间文字不对等的情况下想让下面的操作文字距离底部对齐,如图: , 刚开始觉得使用margin-bottom就可以,后来发现只有margin-top是管用的,查了资料 ...
- ispoweroftwo 判断2的次幂
首先结果是: public bool IsPowerOfTwo(int n) { if(n<1) return false;//2的次幂一定大于0 return ((n & (n -1) ...
- web性能优化之js图片懒加载
html <div class="container"> <ul> <li> <div id="first" clas ...
- Spring框架的基本使用(IOC部分)
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. Spring的好处 1.方便解耦,简化开发: Spring就是一个大工厂,专门负责生成Bean,可以将所有对象创建和依赖关 ...
- 修饰符(动态String数组篇)--- 常用 解除疑问。
1.无修饰符----是直接传基本类型的地址过来,并没有把基本类型的指针复制一份入栈,所以一旦修改就是修改原来的值. 2.const 修饰符 与 无修饰符一致. 3.var修饰符 与 上一致. 4.ou ...
- Ubuntu 登陆循环启动 无法进入桌面 libGL error: failed to load driver: swrast
导致无法进入Ubuntu图形界面的原因很多,关键是要找到问题原因所在. 最佳的方法是查看.xsession-errors这个日志文件,依据问题解决~ 这里先汇总一下问题: 1 环境变量导致的,进入tt ...
- XML&反射
本节内容: XML DTD约束 Schema约束 dom4j解析 反射 为了实现访问不同路径(/hello)执行不同的资源(HelloMyServlet),我们需要使用XML进行配置:为了限定XML内 ...
- WangSql 3.0源码共享(WangSql 1.0重大升级到3.0)
WangSql 1.0博文阅读: http://www.cnblogs.com/deeround/p/6204610.html 基于1.0做了以下重大改动: 1.多数据实现方式调整 2.使用EmitM ...
- 【POJ】1740.A New Stone Game
题解 想去学习一下博弈论的SG函数 不过貌似这道题就是猜结论并且证明 题意是,随便选择一堆石子,扔掉至少一个,然后从扔石子的这堆里选择任意多(可以不选)放到其他任意多的未选择完的石堆里 一堆石子,先手 ...