POJ - 3045 Cow Acrobats (二分,或者贪心)
2024-08-23 14:14:48
一开始是往二分上去想的,如果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 ;
}
最新文章
- JAVA反编工具件安装 JD-eclipse
- asp.net中插件开发模式说明
- JAVA求圆的面积
- Oracle查询DQL脚本记录
- Python之调用函数
- javaEE(web)SEO优化 Yahoo军规
- vim语法高亮不起作用解决
- Eclipse 代码格式化
- view class source code with JAD plugin in Eclipse
- android网络请求之get方法
- .NET自动字符编码识别程序库 NChardet
- oracle数据库对date字段类型存在空值进行排序的处理方法
- centos中apache-tomcat的配置
- Spring Boot初探之restful服务发布
- docker 容器 详解
- Android与H5交互 原理与对比
- selenium+PhantomJS小案例—爬豆瓣网所有电影代码python
- vue中router使用keep-alive缓存页面的注意事项
- tomcat启动项目报错:The specified JRE installation does not exist
- thinkphp5 数据库和模型
热门文章
- [CentOS7] 搭建vncserver,远程通过vncviewer来查看图形界面
- 任务计划cron
- 如何在html文件中导入header、footer等
- 练习六:斐波那契数列(fibonacci)
- mybatis获得执行insert的返回值
- about 字节
- 【JavaEE】tomcat部署项目的几种方式 .
- 为什么有人会觉得IT门槛低,工资高?
- qemu 出现Could not access KVM kernel module: No such file or directory failed to initialize KVM: No such file or directory
- HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】ACdream 1429——Diversion——————【树链剖分】