poj3045 Cow Acrobats(二分最大化最小值)


https://vjudge.net/problem/POJ-3045

读题后提取到一点:例如对最底层的牛来说,它的崩溃风险=所有牛的重量-(底层牛的w+s),则w+s越大,越在底层。

注意范围lb=-INF。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<map>
 8 #define lson l, m, rt<<1
 9 #define rson m+1, r, rt<<1|1
10 #define INF 0x3f3f3f3f
11 typedef long long ll;
12 using namespace std;
13 typedef struct{
14     ll w, s;
15     ll sum;
16 }Node;
17 Node node[100010];
18 ll n, sum=0;
19 int C(int x)
20 {
21     ll maxm = -INF, _sum=sum;
22     for(int i = 0; i < n; i++){
23         ll tmp = _sum-node[i].sum;
24         _sum -= node[i].w;
25         if(tmp>x) return 0; 
26     }
27     return 1;
28 }
29 bool cmp(const Node a, const Node b)
30 {
31     if(a.sum != b.sum)
32         return a.sum>b.sum;
33     else return a.s>b.s;
34 } 
35 int main()
36 {
37     scanf("%lld", &n);
38     for(int i = 0; i < n; i++){
39         scanf("%lld%lld", &node[i].w, &node[i].s);
40         node[i].sum = node[i].w+node[i].s;
41         sum += node[i].w; 
42     }
43     sort(node, node+n, cmp);
44     ll lb=-INF, ub=INF;
45     while(ub-lb>1){
46         ll mid = (lb+ub)>>1;
47         if(C(mid)){
48             ub = mid;
49         }
50         else lb = mid;
51     }
52     printf("%lld\n", ub);
53     return 0;
54 }

优质内容筛选与推荐>>
1、android开发期间使用真机调试但系统无法识别出真机
2、centos网卡配置NM_CONTROLLED=”yes” 慎用
3、C#弹出选择对话框的程序
4、Nginx PHP MySql 编译安装
5、springboot动态修改日志级别+权限认证


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号