退役四連測題解(一)

2021-09-05 09:26:57 字數 1758 閱讀 9816

有q只猴子要從第一棵樹到第n棵樹去,第i只猴子一次跳躍的最遠距離為ki。如果它在第x棵樹,那它最遠可以跳到第x+ki棵樹。如果第j棵樹的高度比第i棵樹高或相等,那麼它從第i棵樹直接跳到第j棵樹,它的勞累值會增加1。所有猴子一開始在第一棵樹,請問每只猴子要跳到第n棵樹花費的勞累值最小。

第一行乙個整數n,表示有n棵樹。(2<=n<=1000000)

接下來第二行給出n個正整數d1,d2,……,dn(1<=di<=10^9),其中di表示第i棵樹的高度。

第三行給出了乙個整數q(1<=q<=25),接下來q行,給出了每只猴子一次跳躍的最遠距離ki(1<=ki<=n-1)。

輸出q行,每行乙個整數,表示乙隻猴子的最小的勞累值。

設乙個dp[1~n]陣列,dp[i]表示從起點到第i棵樹的最小疲勞值。顯而易見,dp[i]=max(dp[i-k~i]);就是乙個標準的單調佇列優化dp。

不多說了,水題,考試現場ac,上**。(較醜,求諒解。)

#include#define m (1000000 + 5)

inline void read(int &x)

while(c>='0'&&c<='9')

x*=f;

return ;

}void print(int x)

print(x/10);

putchar(x%10+'0');

}void write(int x)

struct nodet;

struct deque

bool empty()

q.push(t);

}write(q.dep().s);

putchar('\n');

}return 0;

}​

見洛谷(p2885 [usaco07nov]**線telephone wire)

dp[i][j]表示考慮前ii個電線桿,且第i根高度為j時的最小花費

dp[i][j]=min(dp[i-1][k]+j*c-k*c)+(j-h_i)^2(k<=j)

dp[i][j]=min(dp[i-1][k]+k*c-j*c)+(j-h_i)

^2(j<=k)

(j-h_i)^2(j−hi​)2是定值,min()裡面的值可以直接用乙個變數mi維護

即在求dp[i][j]得時候對j分別正序倒序更新一次

正序更新開始前先令mi=min(dp[i-1][k]-k*c)(1<=k<=h_i)

正序從j=h_i開始到j=100都要更新,每次更新dp[i][j]dp[i][j]前先更新mi=min(mi,dp[i-1][j]-j*c)

倒序從j=100開始到j=h_i都要更新,每次更新dp[i][j]前先更新mi=min(mi,dp[i-1][j]+j*c)

這樣複雜度就降到了o(n*h)

#include#define m (100000 + 5)

int max(int a,int b)

while(c>='0'&&c<='9')

x*=f;

return ;

}int n,c,h[m],dp[m][m/1000+5],maxn,ans=1e9;

int main()

mi=1e9;

for(int j=maxn;j>=h[i];j--)

}for(int i=1;i<=maxn;i++)

ans=min(ans,dp[n][i]);

printf("%d",ans);

}

社團四連測之第一測 Monkey

目錄題目 解題思路 題目描述 有q只猴子要從第一棵樹到第n棵樹去,第i只猴子一次跳躍的最遠距離為ki。如果它在第x棵樹,那它最遠可以跳到第x ki棵樹。如果第j棵樹的高度比第i棵樹高或相等,那麼它從第i棵樹直接跳到第j棵樹,它的勞累值會增加1。所有猴子一開始在第一棵樹,請問每只猴子要跳到第n棵樹花費...

四連測(二) 奶牛慢跑

有n n 100000 頭奶牛在乙個無窮長的小道上慢跑。每頭奶牛的起點不同,速度也不同。小道可以被分成多條跑到。奶牛只能在屬於自己的跑道上慢跑,不允許更換跑道,也不允許改變速度。如果要慢跑t t 1000000000 分鐘,要保證在任何時候不會有同一跑道上的奶牛相遇,請問最少需要多少條跑道。奶牛開始...

四連測(二) 測量溫度(temperature)

某國進行了連續n 1 n 1000000 天的溫度測量,測量存在誤差,測量結果是第i天溫度在 l i,r i 範圍內。其中 10 9輸入 第一行乙個整數n。接下來n行,每一行兩個整數,表示l i和r i。輸出 接下來輸出乙個整數,表示答案。樣例輸入 6 6 10 1 54 8 2 56 8 3 5樣...