有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樣...