jzoj 1146. 危险系数(acrobat)

本文探讨了一个有趣的算法问题——杂技叠罗汉,通过贪心算法实现人员排序以最小化最大危险系数。介绍了问题背景、输入输出要求,并提供了具体的样例及实现代码。
题目描述
      N(1 <= N <= 50,000,标记为1..N)个人计划玩一个叠罗汉杂技,除了最底下的那个人以外每个人都站在另一个人的头顶上。每个人都有自己的体重W_i(1<=W_i<=10,000)和力量S_i(1<=S_i<=1,000,000,000),每个人的危险系数定义为他所承受的重量(注意:不包括他自己)减去他的力量所得到的差,你的任务是找出使得N个人中最大的危险系数最小的顺序。
输入
第一行:输入一个整数N;
第2到第N+1行:其中第i+1行描述第i个人的体重和力量,中间用空格隔开。
输出
输出一个整数表示最优顺序中最大的危险系数。
样例输入
3
10 3
2 5
3 3
样例输出
2

数据范围限制




贪心,为了达到最优,应该使越下面的人的力量和体重尽可能大,所以以体重和力量的和为关键字排序,

然后直接求解就好了。

代码如下:

var
 a,b,c:array[1..50000]of longint;
 n,max:longint;

procedure init;
var i:longint;
begin
 readln(n);
 for i:=1 to n do
  begin
   readln(a[i],b[i]);
   c[i]:=a[i]+b[i];
  end;
end;

procedure qsort(l,r:longint);
var i,j,k,m:longint;
begin
 if l>=r then exit;
 i:=l; j:=r; k:=c[(i+j) div 2];
 repeat
  while c[i]<k do inc(i);
  while c[j]>k do dec(j);
  if i<=j then
   begin
    m:=c[i]; c[i]:=c[j]; c[j]:=m;
    m:=a[i]; a[i]:=a[j]; a[j]:=m;
    m:=b[i]; b[i]:=b[j]; b[j]:=m;
    inc(i); dec(j);
   end;
  until i>j;
 qsort(l,j);
 qsort(i,r);
end;

procedure main;
var i,k,j:longint;
begin
 k:=0;
 max:=-maxlongint;
 for i:=1 to n do
  begin
    if k-b[i]>max then max:=k-b[i];
    k:=k+a[i];
  end;
 write(max);
end;

begin
 assign(input,'acrobat.in');reset(input);
 assign(output,'acrobat.out');rewrite(output);
 init;
 qsort(1,n);
 main;
 close(input); close(output);
end.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值