貪心策略 相鄰交換 學習筆記

2022-05-30 17:48:08 字數 4138 閱讀 2440

題解主要寫貪心的考慮方法:相鄰交換法。

我們在平時的貪心題幾乎都可以正確的貪心方法。

設交換前對答案的貢獻為x,交換後對答案的貢獻為y

l  若x>y則不交換

l  若xl  若x==y則不交換(交換反而增加時間複雜度)

作為題目,需要建立數學模型設定未知數表示x和y得到不等式從而得出排序的關鍵字、

**:

題目大意:給出序列a和b,可以同時改變ai和bi 求出一種最優的序列最小化的[n]

設排序後,某位置上編號為i,後面一位的編號為j,第i個之前所有a之和為x,i前面位置的c(c_(i-1))值為y,那麼

t1=max(max(y,x+ai)+bi,x+ai+aj)+bj

t2= max(max(y,x+aj),x+ai+aj)+bi

(t1不妨把t1化簡:

l  max(max(y,x+ai)+bi,x+ai+aj)+bj 可以化為

l  max(max(y+bi,x+ai+bi),x+ai+aj)+bj

l  max(max(y+bi+bj,x+ai+bi+bj),x+ai+aj+bj)

l  max(y+bi+bj,x+ai+bi+bj,x+ai+aj+bj)

同理 t2化簡結果是:

l  max(y+bi+bj,x+aj+bi+bj,x+ai+aj+bi)

列出來就是:

l  max(y+b

i​+b

j​,x+a

i​+b

i​+b

j​,x+a

i​+a

j​+b

j​)i​+b

j​,x+a

j​+b

i​+b

j​,x+a

i​+a

j​+b

i​)消去y+bi+bj可得:

l  max(x+ai​+bi​+bj​,x+ai​+aj​+bj​)

消去x可得:

l  max(ai​+bi​+bj​,ai​+aj​+bj​)< (aj​+bi​+bj​,ai​+aj​+bi​)

打出去:

l  max(bi​,aj​)+ai​+bj​

移項l  max(b

i​,a

j​)−a

j​−b

i​j​,a

i​)−a

i​−b

j左邊:aj和bi中大數消掉留下aj和bi小數的相反數

右邊:aj和ai中大數被消掉,留下ai和bj中小數的相反數

得:l  −min(a

j​,b

i​)<−min(a

i​,b

j​)再得:

l  min(a

i​,b

j​)j​,b

i​)

# include # define ll 

long

long

using

namespace

std;

const

int maxn=20005

;struct

reca[maxn];

bool

cmp(rec a, rec b)

intmain()

printf(

"%lld\n

",lt);

}return0;

}

小於號沒有傳遞性,如排出的序列可能是這樣的:

7 31 1

1 6ans=17

這樣也是最優的:

1 11 6

7 3ans=12

顯然下面正確,最終我們找到這樣的解釋:

按條件判斷相等的兩組數交換一次對後面確實不會產生影響,但可以通過多次交換對最終結果產生影響。

這個判斷的條件沒有傳遞性。

怎麼讓他有傳遞性呢?

顯然分塊來做

l  ai

l  ai=bi

l  ai>bi

# include # define ll 

long

long

using

namespace

std;

const

int maxn=20005

;struct

reca[maxn];

intpart(rec a)

bool

cmp11(rec a,rec b)

intmain()

printf(

"%lld\n

",lt);

}return0;

}

**:

題目大意:

國王自己也在左、右手上各寫乙個整數。然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是:排在該大臣前面的所有人的左手上的數的乘積除以他自己右手上的數,然後向下取整得到的結果。

方法是一樣的,選取序列中間的連續的兩個人相鄰交換法求解。

有中間兩個人 i 和 i+1,顯然他們倆怎麼排對後面沒有影響(因為只跟乘積有關)

設p為國王到i-1個人左手數的乘積,

l  若不換max < max

l  兩邊除以p乘以(b[i]*b[i+1])

l  可知:max < max

l  左邊a[i]*b[i]恆》右邊b[i]

l  右邊a[i+1]*b[i+1]恆》左邊b[i+1]

原式可化為: a[i]*b[i]所以排序方式為兩數左手數乘以右手數遞增即可

注意高精度。

# include # define rint register 

int# define ll

long

long

using

namespace

std;

const

int maxn=1e4 + 10,l=3e4 + 10

; char

s[l];

struct

reca[maxn];

intn;

bool cmp(rec a,rec b)

inline ll read()

while(c>='

0'&&c<='

9') x=(x<<3)+(x<<1)+(c^48),c=getchar();

return w?-x:x;

}struct

lint

if (ans.num[ans.len+1]>0) ans.len++;

return

ans;

} inline lint

operator * (const lint &t) const

if (ans.num[len+t.len]>0

) ans.len=len+t.len;

else ans.len=len+t.len-1

;

return

ans;

}inline lint

operator / (const

int &x)

while (!a.num[a.len]&&a.len>1) a.len--;

return

a; }

inline

bool

operator > (const lint &t) const

inline

void swap(lint &a,lint &b)

inline

void

print(lint x)

inline lint change(ll x)

a.len=0

;

while (x>0) a.num[++a.len]=x%10,x/=10

;

return

a; }

}r;int

main()

r.print(ans);

return0;

}

from:     hgoi

name:ljc20020730

date: 20181003

2019 4 26 路由交換學習筆記

路由優先順序 路由備份 路由優先順序 preference 思科 管理距離 是用來衡量路由的優先程度,到達同乙個目標有兩種路由協議,此時會優先選擇路由優先順序較小的路由協議。其中預設的協議優先順序 driect 直連路由 0 ospf 10 static 靜態路由 60 rip 100 配置協議優先...

華為路由交換學習篇 NAT

目錄 nat的實現方式 basic nat方式 動態nat easy ip natserver 一對一 見實驗一 basic nat屬於一對一的位址轉換,在這種方式下只轉換ip位址,而不處理tcp udp協議的埠號,乙個公網ip位址不能同時被多個私網ip位址使用者使用。靜態nat並不能實現節省ip位...

華為路由交換學習篇 IP基礎

目錄 層次化的ip編制方案 特殊位址 私有ip位址 arp 分類 實驗 路由器ip位址配置實驗 實驗拓撲圖 聯通性測試 根據rfc791,對網路型別劃分如下 a類網路位址 a類網路位址的第乙個bit必須為0,即a類網路位址第乙個8位的取值範圍就是0 00000000 127 011111111 a類...