永发信息网

合并果子问题pascal

答案:4  悬赏:50  手机版
解决时间 2021-08-18 08:06

我的想法是:从小到大排序 加合前面2个,不断循环

但是和答案差一点 谁帮我看看..

type
        int=longint;
var
        n,s,i,k,last:int;
        ai:array[1..20000]of int;

procedure qsort(l,r:int);
var
        i,j,mid,k:int;
begin
        i:=l; j:=r; mid:=ai[random(r-l)+l];
        repeat
                while ai[i]<mid do inc(i);
                while ai[j]>mid do dec(j);
                if i<=j then
                begin
                        k:=ai[i];
    ai[i]:=ai[j];
   ai[j]:=k;
                        inc(i); dec(j);
                end;
        until i>j;
 if i<r then qsort(i,r);
        if j>l then qsort(l,j);
end;

begin
        assign(input,'p1066.in');reset(input);
        assign(output,'p1066.out');rewrite(output);
        readln(n);
        for i:=1 to n do
        read(ai[i]);
        last:=n;

        for i:=1 to n do
        begin
                qsort(1,last);
                ai[2]:=ai[1]+ai[2];
                ai[1]:=0;
                k:=ai[last];
                ai[last]:=ai[1];
                ai[1]:=k;
                dec(last);
                s:=s+ai[2];
        end;

        writeln(s);
        close(input);close(output);
end.

最佳答案

你每次都快排,时间复杂度太高,会超时。


不过你的思路是对的,但要用堆排来实现。


var
 x,y,i,j,k,m,n,t:longint;ans:int64;
 a:array[1..20000]of longint;


procedure work(i,n:longint);
var j,t:longint;
begin
 j:=i*2;
 while j<=n do
  begin
   if (j<n)and(a[j]>a[j+1]) then j:=j+1;
   if a[j]<a[i] then
    begin
    t:=a[i];a[i]:=a[j];a[j]:=t;
    i:=j;j:=i*2;
    end else exit;
  end;
end;


begin
 readln(n);m:=n;
 for i:=1 to n do read(a[i]);
 for i:= (n div 2) downto 1 do work(i,n);


 for k:=1 to n-1 do
  begin
   x:=a[1];a[1]:=a[m]; work(1,m-1);dec(m);
   y:=a[1];a[1]:=x+y;  work(1,m);
   ans:=x+y+ans;
  end;


 writeln(ans);
end.

全部回答

你的想法不错,但方法不行。

第一次用快排,以后用插排,不能用快排,不用堆排都可以。

具体程序如下算法:

var   a:array[0..15000] of longint;   i,j,n,k,tem,ans:longint; procedure sort(l,r:longint); var   i,j,x,y: longint; begin   i:=l;   j:=r;   x:=a[(l+r) div 2];   repeat     while a[i]<x do     i:=i+1;     while x<a[j] do     j:=j-1;     if not(i>j) then     begin     y:=a[i];     a[i]:=a[j];     a[j]:=y;     inc(i);     j:=j-1;     end;   until i>j;   if l<j then     sort(l,j);   if i<r then     sort(i,r); end; begin   assign(input,'T4.in');reset(input);   assign(output,'T4.out');rewrite(output);   readln(n);   for i:=1 to n do read(a[i]);   sort(1,n);   ans:=0;   i:=1;   while i<n do   begin     tem:=a[i]+a[i+1];     ans:=ans+tem;     j:=n;     while a[j]>tem do j:=j-1;     for k:=i to j do     a[k-1]:=a[k];     a[j]:=tem;     i:=i+1;   end;   writeln(ans);   close(input);close(output); end.

tyvj的题目吧,大概是超时了吧,只能过几个点。你每次都快排,时间复杂度太高,每次改变的量都是ai[2],ai[1],不如把ai[2]插入,不过整个要动一动。每次去除ai[i],使ai[i+1]:=a[i+1]+a[i];从ai[i+2]向后搜,找到ai[i+1]的新位置,插入,其余前移一位,这样可以节约不少时间,当然用链表来做插入更方便

预处理时用快速排序,然后用堆做
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
增大虚拟空间
求香港铁路广告灵异事件???
带有“为”和“观”的成语
口袋妖怪绿叶版相关问题
DNF50去哪里升级好。
谁对DNF武器价钱比较精通啊?我有问题
为什么qq餐厅加载到71%就上不去了
八大菜系是哪八大哟
怀孕三个半月睡觉的时候总是觉肚子不舒服的.
为什么我在书城搜不到血色迷梦 请问各位大大
长阳土家族自治县宜昌多乐士漆专卖店哪位知道
我们的节日英语怎么说,我们的节日 英语怎么说
一级离火丹哪里何以得到
爱心感谢的名言,求这句话的出处: 你该知道此
丹青溢彩什么意思,翰墨飘香 丹青溢彩 是什么
推荐资讯
桂林医学院临床医学10新生的住宿怎么样??
灼眼的夏娜第3季什么时候出?
青春年华易逝,我们应该做些什么准备.
风兮兮,易水寒什么意思
推持六天恶心肚子疼有分秘物是怀孕了
解读一个故事!它有什么隐含情节?作者想要告
跆拳道比赛口号,跆拳道的宣言是哪一句
宛城区南阳金钗石斛行地址在哪,我要去那里
如果只剩下最后一年的生命了,你会干什么?
黄州区黄冈黄州区路口镇综合文化站我想知道这
刷深渊出个这怪,是吗怪?
鹤山区鹤壁中国工商银行24小时自助银行(中山
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?