4985: 评分

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 148  Solved: 75
[Submit][Status][Discuss]

Description

Lj最近参加一个选秀比赛,有N个评委参加了这次评分,N是奇数。评委编号为1到N。每位评委给Lj打的分数是一个
整数,评委i(1 ≦ i ≦ N)的打分为Di。这次采用了一种创新的方法计算最后得分,计算规则是:最初N位评委排
成一排,检查队伍排头的3位评委的评分,去掉一个最高分和一个最低分,剩下的一个评委移动到队伍最后,反复
执行以上操作,直到队伍中的评委只剩一位,那么这个评委的打分就是Lj的最后得分。由于有的评委年纪比较大了
,不记得自己的位置了,现在有M(1 ≦ M ≦ N - 2)个评委很快找到了自己的位置,剩下的N-M人找不到位置了,
需要给他们重新安排位置。
由于Lj希望自己的得分尽可能高。请你帮忙计算出LJ最后得分可能的最大值。

Input

第一行为整数N和M,用空格分隔。表示有N位评委,其中M人的初始排列位置已经确定。
接下来M行中第i行(1 ≦ i ≦ M)为两个整数Di和Pi,用空格分隔。
表示第i位评委的评分为Di,初始排列位置为队伍排头开始的第Pi位。
接下来N-M行中第i行(1 ≦ i ≦ N ? M)为整数Di+M,表示评委(i+M)的评分为Di+M。
3 ≦ N ≦ 99 999,
1 ≦ M ≦ N - 2,
1 ≦ Di ≦ 109 (1 ≦ i ≦ N),
1 ≦ Pi ≦ N (1 ≦ i ≦ M),
Pi != Pj (1 ≦ i < j ≦ M)。

Output

 输出一行,为1个整数,表示LJ得分的最大值。

Sample Input

7 3
5 2
5 5
8 6
6
2
8
9

Sample Output

8
//最高得分的评分排列: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】的更多相关文章

  1. BZOJ 4985: 评分

    二分答案 >=key的记为1 f[i]表示令i位置为1所需要的最少的1的个数 队列模拟 #include<cstdio> #include<algorithm> usin ...

  2. BZOJ.2655.calc(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...

  3. BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)

    BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...

  4. BZOJ 1040 树形DP+环套树

    就是有n个点n条边,那么有且只有一个环那么用Dfs把在环上的两个点找到.然后拆开,从这条个点分别作树形Dp即可. #include <cstdio> #include <cstrin ...

  5. bzoj 3851: 2048 dp优化

    3851: 2048 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 22  Solved: 9[Submit][Status] Description T ...

  6. BZOJ 1068 (区间DP)

    题意:字符串的压缩,f[l][r][0]代表还没M,f[l][r][1]代表有M. #include<cstdio> #include<cmath> #include<c ...

  7. BZOJ 4321: queue2( dp )

    dp(i, j, 1)表示前i个, 有j对是不合法的, i和i-1是在一起的. dp(i, j, 0)表示前i个, 有j对是不合法的, i和i-1不在一起的. 转移我们只需考虑是多了一对不合法的还是少 ...

  8. BZOJ 3156: 防御准备( dp + 斜率优化 )

    dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...

  9. BZOJ.4361.isn(DP 树状数组 容斥)

    题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...

随机推荐

  1. 一步一步搭建11gR2 rac+dg之配置单实例的DG(八)【转】

    RAC主库配置单实例ActiveDataguard 本文文档结构: 这里配置的过程中需要注意的一项是多看看rac1和rac2以及dg的告警日志会对配置过程有更深刻的理解...配置oracle rac的 ...

  2. shell 指令分析nginx 日志qps

    实时分析 tail -f points.api.speiyou.cn.access.log|awk 'BEGIN{key="";cnt=0}{if(key==$5){cnt++}e ...

  3. linux用户权限 -> ACL访问控制

    UGO设置基本权限: 只能一个用户,一个组和其他人 ACL设置基本权限: r.w.x 设定acl只能是root管理员用户. 相关命令: getfacl , setfacl facl权限 简介 facl ...

  4. SLF4J multiple

    "C:\Program Files\Java\jdk1.8.0_65\bin\java" -Didea.launcher.port=7537 "-Didea.launch ...

  5. HMM算法

    HMM的应用 HMM是生成模型 词性标注:给定一个词的序列(也就是句子),找出最可能的词性序列(标签是词性).如ansj分词和ICTCLAS分词等. 分词:给定一个字的序列,找出最可能的标签序列(断句 ...

  6. qlserver排序规则在全角与半角处理中的应用

    --1.查询区分全角与半角字符--测试数据DECLARE @t TABLE(col varchar(10))INSERT @t SELECT 'aa'UNION ALL SELECT 'Aa'UNIO ...

  7. MySQL学习笔记:limit

    MySQL支持用limit语句来设置查询的行数范围,同Hive. LIMIT a, b; a:从a+1开始: b:取b行数据: 1.取出第一行记录: ,; 2.取出第二行记录: ,; 3.取出从11开 ...

  8. appium----新版appium 1.11.1 支持ByName定位

    org.openqa.selenium.InvalidSelectorException: Locator Strategy 'name' is not supported for this sess ...

  9. day5模块学习--hashlib模块

    hashlib模块     Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...

  10. mac系统编译安装ImageMagick7.0.1-3

    1.下载源码包: git clone http://git.imagemagick.org/repos/ImageMagick.git 2.编译安装: cd ImageMagick/ ./config ...