開車旅行(演算法競賽高階指南,倍增優化 DP)

2021-10-02 11:44:05 字數 2350 閱讀 5388

中文題有點長,就不誤導大家了...

先預處理出一下量:

f[i][j][k]:從城市 j 出發,k 先走,走

da[i][j][k]:從城市 j 出發,k 先走,走db[i][j][k]:從城市 j 出發,k 先走,走

求出上述結果後,我們就可以利用倍增以下面給出上述結果的求解方法.

倒序列舉城市 i,二分可以找出第乙個高度大於等於城市 i 的城市,左右尋找即可.

void init_g()

else if(d < sm)

++j;

}ga[i] = smi, gb[i] = mni;

st.emplace(make_pair(h[i], i));}}

f[i][j][k]:從城市 j 出發,k 先走,走i = 0:f[0][j][0] = ga[j], f[0][j][1] = gb[j];

i = 1:f[1][j][k] = f[0, f[0][j][0], 1 - k];

i > 1:f[i][j][k] = f[i - 1][f[i - 1][j][k]][k];

void init_f()

for(int j = 1; j <= n; ++j)

}for(int i = 2; i < n; ++i)}}

}

da[i][j][k]:從城市 j 出發,k 先走,走db[i][j][k]:從城市 j 出發,k 先走,走

首先定義函式 get_dist(i, j) = abs(h[i] - h[j]);

i = 0:da[0][j][0] = get_dist(j, ga[j]), da[0][j][1] = 0;

db[0][j][0] = 0, db[0][j][1] = get_dist(j, gb[j]);

i = 1:da[1][j][k] = da[0][j][k] + da[0][f[0][j][k]][1 - k];

db[1][j][k] = db[0][j][k] + db[0][f[0][j][k]][1 - k];

i > 1:da[i][j][k] = da[i - 1][j][k] + da[i - 1][f[i - 1][j][k]][k];

db[i][j][k] = db[i - 1][j][k] + db[i - 1][f[i - 1][j][k]][k];

int get_dist(int i, int j)

void init_d()

for(int j = 1; j <= n; ++j)

}for(int i = 2; i < n; ++i)}}

}

#include using namespace std;

typedef long long ll;

const int m = (int)1e5;

const int n = (int)17;

const ll inf = 0x3f3f3f3f3f3f3f3f;

int n;

int h[m + 5];

int ga[m + 5], gb[m + 5];

int f[n][m + 5][2];

ll da[n][m + 5][2], db[n][m + 5][2];

void read()

void init_g()

else if(d < sm)

++j;

}ga[i] = smi, gb[i] = mni;

st.emplace(make_pair(h[i], i));

}}void init_f()

for(int j = 1; j <= n; ++j)

}for(int i = 2; i < n; ++i)}}

}int get_dist(int i, int j)

void init_d()

for(int j = 1; j <= n; ++j)

}for(int i = 2; i < n; ++i)}}

}void init()

void cal(int s, int x, int& la, int& lb)

}}void work()

}printf("%d\n", ans);

int m;

scanf("%d", &m);

while((m--) > 0)

}int main()

《演算法競賽高階指南》 防曬

有c頭奶牛進行日光浴,第i頭奶牛需要minspf i 到maxspf i 單位強度之間的陽光。每頭奶牛在日光浴前必須塗防曬霜,防曬霜有l種,塗上第i種之後,身體接收到的陽光強度就會穩定為spf i 第i種防曬霜有cover i 瓶。求最多可以滿足多少頭奶牛進行日光浴。輸入格式 第一行輸入整數c和l。...

《演算法競賽高階指南》蚯蚓

蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有 n 只蚯蚓,第 i 只蚯蚓的長度為 ai 所有蚯蚓的長度都是非負整數,即可能存在長度為0的蚯蚓。每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻,將其切成兩段。若有多隻最長的,則任...

演算法競賽高階指南筆記

原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 其中,第一位為1是負數 1 0000 0001 原 1 1000 0001 原 因此,8位二進位制數的取值範圍 127,127 補碼正數的補碼是其本身 負數的補碼是在其原碼的基礎上,符號位不變,其餘各位取...