8 15 完美交換 2699

2021-08-06 06:34:08 字數 2241 閱讀 2338

你和你的夥伴們將禮物都裝好了,你們抱著各自的禮物,想通過交換讓你們總和的完美值最大。你們的 總和完美值 的計算方法是:每個人的位置*每人禮物的完美值 再求總和。

我們保證每個人手上的完美值都不等。

如下表:

位置 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繫...