题目背景
Farmer John 养了 N 头牛,她们已经按 1∼N 依次编上了号。FJ 所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团的演出。可奶牛们很快发现她们那笨拙的蹄子根本无法在钢丝或晃动的的秋千上站稳(她们还尝试过把自己装在大炮里发射出去,但可想而知,结果是悲惨的) 。最终,她们决定练习一种最简单的杂技:把所有牛都摞在一起, 比如说, 第一头牛站在第二头的身上, 同时第二头牛又站在第三头牛的身上…最底下的是第 N 头牛。
题目描述
每头牛都有自己的体重以及力量,编号为 ii 的奶牛的体重为 Wi,力量为 Si
当某头牛身上站着另一些牛时它就会在一定程度上被压扁,我们不妨把它被压扁的程度叫做它的压扁指数。对于任意的牛,她的压扁指数等于摞在她上面的所有奶牛的总重(当然不包括她自己)减去它的力量。奶牛们按照一定的顺序摞在一起后, 她们的总压扁指数就是被压得最扁的那头奶牛的压扁指数。
你的任务就是帮助奶牛们找出一个摞在一起的顺序,使得总压扁指数最小。
输入格式
第一行一个整数 N。
接下来 N 行,每行两个整数 Wi
和 Si
输出格式
一行一个整数表示最小总压扁指数。
样例 #1
样例输入 #1
310 3
2 5
3 3
样例输出 #1
2
题解
一道struct排序加一点复杂的贪心.
首先
那肯定是结构体排序啊定义一个结构体
开long long 开long long 开 long long
我这里用了define
#define int long long
所以int main() 要改为signed main()
struct Node
{
int w;
int s;
}a[注意看数据范围];
其次
那必须结构体排序啊
我们要求压扁总值最小
就要把重量重的放在下面就是把a.w排序
但压扁总值还要cow的力量大,就是把a.s排序
两个加起来就等于比较a.w + a.s排序
所以cmp里要写 x.w + x.s > y.w + y.s.
bool cmp(Node x,Node y)
{
return x.w + x.s > y.w + y.s;
}
一个cmp表示sort的从大到小的顺序
比较重量和力量的加之
sort(a + 1,a + n + 1,cmp);
在把每个cow的重量加起来
for(int i = 1;i <= n;i++)
{
sum += a[i].w;
}
现在就可以枚举每一个牛正在下面的方案了,这里有一个小小的文字游戏啊他是要算每个牛的总压扁指数,但是不是求min,其实应该求max,以为减去自生cow的重量和力量后,越大是不是被压扁的越小啊所以要求max。
用一个sumw 来记录每个cow的总压扁指数,然后用一个Maxx判断大小(Maxx记得给一个极小值)
int sumw = 0;
for(int i = 1;i <= n;i++)
{
sumw = sum - (a[i].s + a[i].w); #计算总压扁指数
if(maxx < sumw)
{
maxx = sumw;
}
sum -= a[i].w;#这里要减去下面牛的重量
}
最后
我们愉快的输出Maxx
cout<<maxx;
然后就可以得到一个AC的好成绩(点赞!!!