一开始是往二分上去想的,如果risk是x,题目要求则可以转化为一个不等式,Si + x >= sigma Wj ,j表示安排在i号牛上面的牛的编号。

如果考虑最下面的牛那么就可以写成 Si + x  ≥ sum W - Wi,为了方便处理把i号牛的信息合并到一起 → Si + Wi + x ≥sum W。

二分x的时候,x是个常量,而从下面往上去安排牛的时候,下面的牛是没有影响决策的,可以看成把Wi去掉。

于是得到一个贪心的选法,把牛按照Si+Wi排序,从下面往上安排牛,可选择的牛应该满足Si+Wi≥lim W, lim W = sum W - x - sigma Wj, j是在i下面的牛。

因为选择是会改变和号部分,lim W越小后面越容易选到,所以我用优先队列选择满足条件Wi最大的一个。复杂度是O(log(T)*nlogn+nlogn)。

交上去A了以后,看了看别人的runtime,感觉复杂度不对,实际上不用每次选取满足条件Wi最大的一个,因为limW是单减的,当Si+Wi可选的时候,后面的牛

一定可以选到,所以只要考虑从后往前数是否存在第一个Si+Wi不可选,如果存在,那么lim W其实和后面的选择顺序是没有关系的。

不用优先队列,复杂度变成了O(logT*n+nlogn)。

最终极的做法应该是贪心了,既然lim W = sum W - x - sigma Wj。sigma Wj的顺序不用考虑,那么只要在不满足条件的时候修改x就好了。

/*********************************************************
* ------------------ *
* author AbyssalFish *
**********************************************************/
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
using namespace std; const int MAX_N = 5e4;
//int W[MAX_N], S[MAX_N];
typedef pair<int,int> pii;
#define WS first
#define W second
int N, sumW;
pii dat[MAX_N]; bool P(int x)
{
int limW = sumW-x, j = N-;
while(j >= && dat[j].WS >= limW){
limW -= dat[j--].W;
}
return j < ;
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
scanf("%d",&N);
int W, S, max_S = ;
for(int i = ; i < N; i++){
scanf("%d%d",&W,&S);
dat[i].WS = W+S;
max_S = max(max_S, S);
sumW += dat[i].W = W;
}
sort(dat,dat+N);
int lb = -max_S, ub = sumW;
while(lb < ub){
int md = (lb+ub)>>;
P(md) ? ub = md : lb = md+;
}
printf("%d\n",lb);
return ;
}

最新文章

  1. JAVA反编工具件安装 JD-eclipse
  2. asp.net中插件开发模式说明
  3. JAVA求圆的面积
  4. Oracle查询DQL脚本记录
  5. Python之调用函数
  6. javaEE(web)SEO优化 Yahoo军规
  7. vim语法高亮不起作用解决
  8. Eclipse 代码格式化
  9. view class source code with JAD plugin in Eclipse
  10. android网络请求之get方法
  11. .NET自动字符编码识别程序库 NChardet
  12. oracle数据库对date字段类型存在空值进行排序的处理方法
  13. centos中apache-tomcat的配置
  14. Spring Boot初探之restful服务发布
  15. docker 容器 详解
  16. Android与H5交互 原理与对比
  17. selenium+PhantomJS小案例—爬豆瓣网所有电影代码python
  18. vue中router使用keep-alive缓存页面的注意事项
  19. tomcat启动项目报错:The specified JRE installation does not exist
  20. thinkphp5 数据库和模型

热门文章

  1. [CentOS7] 搭建vncserver,远程通过vncviewer来查看图形界面
  2. 任务计划cron
  3. 如何在html文件中导入header、footer等
  4. 练习六:斐波那契数列(fibonacci)
  5. mybatis获得执行insert的返回值
  6. about 字节
  7. 【JavaEE】tomcat部署项目的几种方式 .
  8. 为什么有人会觉得IT门槛低,工资高?
  9. qemu 出现Could not access KVM kernel module: No such file or directory failed to initialize KVM: No such file or directory
  10. HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】ACdream 1429——Diversion——————【树链剖分】