3463. 【NOIP2013模拟联考5】军训(training) (Standard IO)

Time Limits: 2000 ms  Memory Limits: 262144 KB  Detailed Limits  

Goto ProblemSet

Description

HYSBZ 开学了!今年HYSBZ 有n 个男生来上学,学号为1…n,每个学生都必须参加军训。在这种比较堕落的学校里,每个男生都会有Gi 个女朋友,而且每个人都会有一个欠扁值Hi。学校为了保证军训时教官不会因为学生们都是人生赢家或者是太欠扁而发生打架事故,所以要把学生们分班,并做出了如下要求:

1.分班必须按照学号顺序来,即不能在一个班上出现学号不连续的情况。

2.每个学生必须要被分到某个班上。

3.每个班的欠扁值定义为该班中欠扁值最高的那名同学的欠扁值。所有班的欠扁值之和不得超过Limit。

4.每个班的女友指数定义为该班中所有同学的女友数量之和。在满足条件1、2、3 的情况下,分班应使得女友指数最高的那个班的女友指数最小。

请你帮HYSBZ 的教务处完成分班工作,并输出女友指数最高的班级的女友指数。

输入数据保证题目有解。

 

Input

第一行仅2 个正整数n, Limit,分别为学生数量和欠扁值之和的上限。

接下来n 行每行2 个正整数Hi,Gi,分别为学号为i 的学生的欠扁值和女友数。

Output

仅1 个正整数,表示满足分班的条件下女友指数最高的班级的女友指数。
 

Sample Input

4 6
4 3
3 5
2 2
2 4

Sample Output

8
【样例解释】
分班按照(1,2),(3,4)进行,这时班级欠扁值之和为4+2=6<=Limit,而女友指数最高的班级为(1,2),为8。容易看出该分班方案可得到最佳答案。
 
 
做法:我们可以二分最大的女友指数最小时为多少,可以设f[i]表示i 开头的班级的欠扁值之和
优化见代码。
 
代码如下:
 #include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#define LL long long
#define N 20007
using namespace std;
LL n, limit, h[N], g[N], sum[N], num[N], z[N], ans, mid, f[N];
int next[N]; LL get(int t)
{
LL tl = t, tr = n;
while (tl < tr)
{
LL mi = (tl + tr) / ;
if (sum[mi] - sum[t - ] >= mid) tr = mi;
else tl = mi + ;
}
return tl;
} bool check()
{
memset(f, 0x7f7f7f7f, sizeof(f));
f[] = ;
for (int i = ; i <= n; i++)
{
int k = get(i);
int x = i;
int ma = h[i];
if (sum[k] - sum[i - ] > mid) k--;
while (x <= k)
{
f[x] = min(f[x], f[i] + ma);
ma = h[x];
x = next[x];
}
f[k + ] = min(f[k + ], f[i] + ma);
}
if (f[n + ] <= limit) return ;
return ;
} int main()
{
scanf("%lld%lld", &n, &limit);
for (int i = ; i <= n; i++)
{
scanf("%lld%lld", &h[i], &g[i]);
sum[i] = sum[i - ] + g[i];
}
int tail = ;
z[] = 1e9 + ;
num[] = n + ;
for (int i = n; i >= ; i--)
{
while (h[i] >= z[tail]) tail--;
next[i] = num[tail];
tail++;
z[tail] = h[i];
num[tail] = i;
}
ans = sum[n];
LL tl = , tr = ans;
while (tl < tr)
{
mid = (tl + tr) / ;
if (check())
{
if (mid < ans) ans = mid;
tr = mid;
}
else tl = mid + ;
}
printf("%lld", tl);
}

最新文章

  1. oracle 11gr2 官方文档下载
  2. selenium启动IE浏览器报错:Unexpected error launching Internet Explorer. Browser zoom level was set to
  3. SQLite不支持的SQL语法总结
  4. mac中添加环境变量
  5. linux modprobe.conf怎么不见了—-CentOS 6
  6. Unity3D 之防止刚体碰撞导致旋转
  7. 安装php时,make步骤报错make: *** [ext/gd/gd.lo] Error 1
  8. 《UNIX环境高级编程》笔记--信号集
  9. poj 3320 Jessica&#39;s Reading Problem(尺取法)
  10. 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
  11. A* a=new B ,会不会产生内存泄露了,露了B-A的部分?
  12. Rundeck部署和基本使用
  13. mybatis_SQL映射(3)
  14. Mint-UI组件 MessageBox为prompt 添加判断条件
  15. Python 基础知识(持续更新中)
  16. ECMAScript 6
  17. 移动端rem适配
  18. EB-GAN系(Energy-based GAN)
  19. scala sortBy and sortWith
  20. Django(框架、模板)

热门文章

  1. C# 读写XML文件的方法
  2. java CyclicBarrier同步屏障
  3. &lt;Openssl下hash函数&gt;
  4. SQLServer 索引的使用情况
  5. C 碎片二 数据类型
  6. Google,真的要离我们而去吗?
  7. HTTPS的加密流程(通俗易懂,不可错过)
  8. 将腾讯视频客户端缓冲的文件转换为一个MP4格式文件
  9. pta数据结构编程题
  10. js 正则匹配(去掉html标签)