2018.07.06【2018提高组】模拟B组
扑克游戏 (Standard IO)
题目:
有一棵无穷大的满二叉树,根为star,其余所有点的权值为点到根的距离,如图:
现在你有一些扑克牌,点数从1到13,你要把这些扑克牌全部放到这个树上:
1. 当你把点数为i的扑克牌放在权值为j的点上,那么你会得到i*j的分数。
2. 当你把一个扑克牌放在一个节点上,那么你就不能把别的扑克牌放在这个节点以及这个节点的子树上。
你的目标是最小化你的得分。
数据分析:
Input
文件名为 poker.in
输入第一行为一个数字N,表示你有的扑克牌数;
接下来一行N个数字,数字在1到13之间。
Output
文件名为 poker.out
一个数字,最小得分。
Sample Input
3
5 10 13
Sample Output
43
思路分析:(一开始写了个记搜爆蛋)
1.快排排一遍
2.将前面最小的两个值加进ans里(ans累加)
3.加完之后将两个最小值合并成新的值插入到数组中(前两个值不要了)
var
a:array[0..10001] of longint;
i,j,n,m,k,ans,dq:longint;
procedure qsort(l,r:longint);
var
i,j,key,t:longint;
begin
i:=l;j:=r;key:=a[(l+r)div 2];
repeat
while a[i]<key do inc(i);
while a[j]>key do dec(j);
if i<=j then begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
begin
readln(n);
for i:=1 to n do
read(a[i]);
qsort(1,n);
for i:=1 to n-1 do
begin
ans:=ans+a[i]+a[i+1];
dq:=a[i]+a[i+1];
j:=1;
while (dq>a[j]) and (a[j]<>0) do inc(j);
for k:=i+1 to j-2 do
a[k]:=a[k+1];
a[j-1]:=dq;
end;
writeln(ans);
end.