你和你的夥伴們將禮物都裝好了,你們抱著各自的禮物,想通過交換讓你們總和的完美值最大。你們的 總和完美值 的計算方法是:每個人的位置*每人禮物的完美值 再求總和。
我們保證每個人手上的完美值都不等。
如下表:
位置 1 2 3 4
所拿禮物的完美值 200 400 100 430
當前的 總和完美值=1200+2400+3100+4430
現在你們通過兩兩交換,要使得最終你們的完美值為最大。
如上例子:經過交換後
位置 1 2 3 4
所拿禮物的完美值 100 200 400 430
總和完美值的最大值=1100+2200+3400+4430
現在要求出最大完美值是多少。另外假設在乙個時間單位內,乙個人只可以做一次的交換動作(當然也可以原地不動),那麼達到最大完美值狀態的最短用時是多少。
對於30%的資料n≤10
對於全部的資料n≤104
對於全部的資料mi≤100050
對於第乙個要求——最大完美值,由亂序和小於有序和可得,快排後a[i]*i即答案。
注意pascal多關鍵字快排有一種很神奇的錯誤,關鍵字應預先處理好,例key和key2,不能是a[key]和b[key],不然會出錯(我也不知道為什麼)
至於第二個要求——達到最大完美值的最小操作時間
注意可以有多個不同的人在同一時間進行交換!
通過觀察可以發現(雖然我沒有發現),需要進行交換的序列總是會形成若干環,如2 3 4 5 1為2->3->4->5->1(->2)。如我們用貪心策略使得每次操作有盡可能多的值歸位,通過舉例可發現貪心策略行不通。包含值的個數為2的環交換次數為1,那麼我們可以盡可能的把乙個環劃分成多個個數為2的環。可以證明乙個環至多通過1個時間單位的交換即可轉換成多個個數為2的環。於是問題變得簡單了:交換次數取決於序列中最大的環的個數,答案存在0,1,2三種可能。
時間複雜度o(n)
var
n,i,j,k,m:longint;
a,b,c,f:array[0..100500]of longint;
max:int64;
procedure qsort(l,r:longint);
var i,j,key,t,c:longint;
begin
if l>=r then exit;
i:=l;j:=r;
key:=a[(l+r) div 2];
c:=b[(l+r) div 2];
repeat
while (a[i]key)or((a[j]=key)and(b[j]>c)) do dec(j);
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
t:=b[i];b[i]:=b[j];b[j]:=t;
inc(i);dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;
begin
// assign(input,'change.in');
// assign(output,'change.out');
// reset(input);rewrite(output);
readln(n);
for i:=1 to n do
begin
readln(a[i]);
b[i]:=i;
end;
qsort(1,n);
for i:=1 to n do
max:=max+a[i]*i;
writeln(max);
for j:=1 to n do
if (f[j]=0)and(b[j]<>j) then
begin
k:=0;
i:=b[j];
fillchar(c,sizeof(c),0);
while c[i]=0 do
begin
c[i]:=1;
i:=b[i];
inc(k);
if k>2 then begin writeln('2');halt;end;
end;
if k=2 then m:=1;
end;
writeln(m);
// close(input);close(output);
end.
最值交換 2
4.20分 從鍵盤輸入10個整數,用函式程式設計實現計算其最大值和最小值,並互換它們所在陣列中的位置。要求按如下函式原型編寫程式 void readdata int a,int n void printdata int a,int n void maxminexchang int a,int n 輸...
交換2個數
交換兩個數的順序,可以交換位址,可以交換值。當用函式呼叫法交換位址的時候,為什麼不可以實現。程式如下 這樣可以實現兩個數的交換 include void swap int x,int y void main void swap int x,int y include為什麼這個方法為什麼就不能實現。m...
多層交換MLS筆記2
多層交換的原理 3層交換的工作原理確實與路由器很相似 ip位址分配到介面,並且定義好路由協議。路由協議的配置就和路由器一樣,不過,介面配置還是略有不同,交換機可以選擇使用vlan介面 路由介面 routed port 和portchannel介面。vlan介面 使3層交換機的3層介面可以和vlan繫...