cho 1 dãy n số nguyên có giá trị lần lượt là a1,a2,...,an. Có k lần đổi dấu một số bất kỳ trong dãy từ âm sang dương và ngược lại. Yêu cầu : Tính tổng lớn nhất có thể của dãy số sau khi thực hiện đổi dấu . Dữ liệu vào: tệp TONGMAX.INP có cấu trúc như sau: - Dòng đầu ghi 2 số nguyên dương n và k( 1<=k<=n<=10 000) - Dòng 2 ghi a1,a2,..,an. (|ai|<= 1000 000). Kết quả: ghi ra tệp TONGMAX.OUT ghi tổng lớn nhất của dãy sau khi đổi dấu . VD TONGMAX.INP TONGMAX.OUT 5 2 9 1 -2 4 -3 -3
2 câu trả lời
uses crt;
var f1, f2 : text;
A, B : array [1 .. 10000] of longint;
S : int64;
i, j, n, k : longint;
begin
clrscr;
assign(f1, 'TONGMAX.INP'); reset(f1);
assign(f2, 'TONGMAX.OUT'); rewrite(f2);
readln(f1, n, k);
j := 0; S := 0;
for i := 1 to n do
begin
read(f1, A[i]);
if A[i] < 0 then
begin
inc(j);
B[j] := A[i];
end;
S := S + A[i];
end;
n := j;
for j := n downto 2 do
for i := 1 to j - 1 do
if B[i] > B[i + 1] then
begin
B[i] := B[i] + B[i + 1];
B[i + 1] := B[i] - B[i + 1];
B[i] := B[i] - B[i + 1] ;
end;
for i := 1 to k do S := S + 2 * Abs(B[i]);
write(f2, S);
close(f1); close(f2);
readln
end.
uses crt;
var i, n, k, m, x: longint;
res: int64;
a: array[0..100000] of longint;
function incr(var a: longint): longint; begin inc(a); exit(a); end;
procedure sort(l, r: longint);
var i, j, x, t: longint;
begin
i:=l; j:=r; x:=a[(l + r) shr 1];
repeat
while a[i] < x do inc(i);
while a[j] > x 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 i < r then sort(i, r);
if l < j then sort(l, j);
end;
begin
clrscr;
readln(n, k);
for i:=1 to n do begin
read(x); if x >= 0 then inc(res, x) else a[incr(m)]:=x;
end;
sort(1, m);
for i:=1 to m do begin
if k > 0 then begin dec(k); a[i]:=-a[i]; end;
inc(res, a[i]);
end;
writeln(res);
readln;
end.