8.14 猪王争霸 2693


题目

工商部门查获了有N个人正在贩卖注水猪肉,现在要你对这N个人的注水猪肉的数量从大到小的排序,并且算出这N个人的注水猪肉总和(单位为……斤)…我们姑且称这些贩卖者为”猪王”吧…
【输入文件】
输入的第一行是一个1到1000的整数N,表示总共有N位猪王参加了争霸赛。以下依次给出每位猪王的描述,一位猪王的描述占据两行,第一行为一个仅由小写字母组成的长度不超过13的字符串,代表这个猪王的名字,第二行一个整数(非负数,<10^2000),代表这个猪王的注水猪肉总斤数。注意,这个整数的首位没有不必要的0。所有猪王贩卖的注水猪肉数量的总长度不会超过2000。
【输出文件】
依次输出按照注水猪肉多少从大到小排好序的各位贩卖者的名字,每个名字占据单独的一行。不能有任何多余的字符。若几个名字的注水猪肉数相同,则按照名字的字典顺序先后排列。(名字长度<=13且均为大写字母),在N+1行输出所有猪王贩卖注水猪肉的数量的总和(输出最后490位)

题解

就是一个排序+高精加的模板题么
排序我打了个冒泡,因为我懒~我懒我骄傲
高精加就不能不打,小气的我只开了500位,读入出了点问题,只得了40,事实证明读入2000位并不会少一斤肉(我倒情愿少一斤肉~Orz),然后读入随便改了一下就过了(虽然冒泡特耗时间)
这个故事告诉我们,不(还)用(是)省(少)的(一)不(斤)要(肉)省(的)比较好

时 间 复 杂 度 O ( n 2 ) 时间复杂度O(n^2) O(n2)
代码

const
  maxn=490;
var
  s:array[0..1000]of string;
  t:array[0..1000]of ansistring;
  n,i,j,l,r:longint;
  a:array[0..2050]of longint;

function sma(s,t:ansistring):boolean;
begin
  sma:=true;
  if (length(s)>length(t)) or
  ( (length(s)=length(t)) and (s>=t) ) then
  exit(false);
end;

function min(a,b:longint):longint;
begin
  if a<b then exit(a) else exit(b);
end;

procedure add(s:ansistring);
var
  b:array[0..2050]of longint;
  i,j,k,l,r:longint;
begin
  l:=1;
  fillchar(b,sizeof(b),0);
  for i:=1 to length(s) do
    b[length(s)-i+1]:=ord(s[i])-48;
  for i:=1 to maxn do
    begin
      a[i]:=a[i]+b[i];
      a[i+1]:=a[i] div 10+a[i+1];
      a[i]:=a[i] mod 10;
    end;
end;

begin
  assign(input,'boss.in9');
  assign(output,'boss.out');
  reset(input);rewrite(output);
  readln(n);
  for i:=1 to n do
    begin
      readln(s[i]);
      readln(t[i]);
    end;
  for i:=1 to n do
    for j:=i+1 to n do
      if ((t[i]=t[j])and(s[i]>s[j]))
      or(sma(t[i],t[j]))
       then
        begin
          t[0]:=t[i];t[i]:=t[j];t[j]:=t[0];
          s[0]:=s[i];s[i]:=s[j];s[j]:=s[0];
        end;
  for i:=1 to n do
    writeln(s[i]);
  for i:=1 to n do
    begin
      add(t[i]);
      j:=1;
    end;
  for j:=maxn downto 1 do
    write(a[j]);
  close(input);close(output);
end.

花谢花飞花满天,红消香断有谁怜。——《红楼梦》·黛玉《葬花吟》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值