纪念品分组pascal程序
从大到小排序,如果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.