从大到小排序,如果a[i]+a[j]没超过限制,就可以加tj,否则i就指向下一个。
-
var w,n,i,j,tj:longint; a:array[0..30000]of longint; procedure kp(l,r:longint); var i,j,mid:longint; begin if l>=r then exit; i:=l;j:=r;mid:=a[(l+r)div 2]; repeat while a[i]>mid do inc(i); while a[j]<mid do dec(j); if i<=j then begin a[0]:=a[i];a[i]:=a[j];a[j]:=a[0]; inc(i);dec(j); end; until(i>j); kp(l,j); kp(i,r); end; begin readln(w); readln(n); for i:=1 to n do readln(a[i]); kp(1,n);//快排,从大到小 i:=1;j:=n;tj:=0;// repeat if (a[i]+a[j])<=w then//前面加后面的结果小于等于w begin inc(tj);//分组加一 inc(i);//指向下一个 dec(j);//指向前一个 end else begin inc(tj);//不是也分组加一 inc(i);//i指向下一个 end; until(i>j); write(tj); end.
本文介绍了一种基于快速排序的算法实现,该算法能够处理一组整数,并将其按照特定条件进行分组。通过从大到小排序并检查每一对元素是否满足条件来完成分组过程。

被折叠的 条评论
为什么被折叠?



