纪中暑假培训 : Data 1 题目一 扑克游戏 (Standard IO)

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.

猜你喜欢

转载自blog.csdn.net/g2523054231/article/details/80945383