题目
工商部门查获了有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.