卧薪尝胆,厚积薄发。
Cow Acrobats
Date: Mon Sep 17 20:58:43 CST 2018
In Category:
NoCategory
Description:
$n$
头牛叠在一起,每头牛有重量和力量,安排一个顺序使得每头牛上方的牛的总重量
$-$
这头牛的力量的最大值最小。
$1\le n \le 50000$
Solution:
类似国王游戏,设相邻的两头牛
$a$
和
$b$
,
$a$
上方牛的总重为
$W$
,
$a$
在上的不稳定度为
$\max(W-s_a,W+w_a-s_b)$
,
$b$
在上的不稳定度为
$\max(W-s_b,W+w_b-s_a)$
,由于
$W+w_b-s_a>W-s_a$
,
$W+w_a-s_b>W-s_b$
,所以实际相当于
$W+w_a-s_b$
和
$W+w_b-s_a$
比较大小,要想让
$a$
在前面,就要让
$W+w_a-s_b<W+w_b-s_a$
,即
$w_a+s_a<w_b+s_b$
,按
$w+s$
排序即可。
Code:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int n;
#define MAXN 50010
struct cow
{
int w,s;
int val;
}s[MAXN];
bool cmp_val(cow a,cow b){return a.val < b.val;}
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;++i)
{
scanf("%d%d",&s[i].w,&s[i].s);
s[i].val = s[i].w + s[i].s;
}
sort(s + 1,s + 1 + n,cmp_val);
int sum_w = 0;
int ans = -0x3f3f3f3f;
for(int i = 1;i <= n;++i)
{
ans = max(ans,sum_w - s[i].s);
sum_w += s[i].w;
}
cout << ans << endl;
return 0;
}
In tag:
算法-贪心
Copyright © 2020
wjh15101051
ღゝ◡╹)ノ♡