試題描述
今天是萬聖節,小l同學開始了一年一度的討要糖果遊戲,但是在剛剛過去的比賽中小有成就的他打算給自己增加一點難度:如果沒有討到每一家的糖果就算輸。
已知小l共有n(n不大於10000)個鄰居,他們都在同一條街上(可以近似看成一條直線),第i個鄰居的座標是xi。l同學的媽媽會在一開始把他送到任意鄰居的門前。現在已知所有鄰居會在di時間後休息(休息以後不能再去打擾),求訪問完所有點的最短時間,如果無解輸出「no solution」。
輸入輸入第一行為乙個正整數表示n,接下來n行,每行兩個用空格隔開的數,分別表示第i個鄰居的位置和休息時間。
輸出輸出乙個數,表示最短時間,無解輸出「no solution」。
輸入示例
51 3
3 15 8
8 19
10 15
輸出示例
11看起來是乙個搜尋或者dp
然鵝發現搜尋會tle
考慮dp:
為了轉移我們儲存的資料我們不能採用普通的區間dp
我們不難發現,為了遍歷直線上的每乙個點,其中乙個端點一定是最後經過的點(自己可以推一下)
所以我們用dp[i][j][0]表示從i到j結束在左端點的最短時間
用dp[i][j][1]表示從i到j結束在右端點的最短時間
於是對於i到j+1的區間在合法範圍內就有了兩種選擇:從i到j區間轉移或者從i-1到j+1區間轉移
但是發現空間開不下於是我們換一種儲存方式
為了節省空間我們只儲存區間起點(壓縮一維儲存區間長度奇數偶數)
於是我們又有了四種轉移方式:
對於從i到j的區間,從i-1到j轉移(兩種)或者從i到j-1轉移(兩種)
關於轉移:
對於區間dp來講,無後效性體現在從一步到下一步的轉移
所以轉移的代價是從結束時間到下乙個節點的距離
關於合法:主要就是時間不要超過
上**複製**
#include
#define inf 0x3f3f3f3f
using namespace std;
int n,dp[2][20010][2],xx[10005],d[10005],nx;
int main()
}int ans=min(dp[nx][www.michenggw.com][0],dp[nx][1][1]);
if(ans>=inf)puts("no www.mhylpt.com solution");
else printf("%d",ans);
return 0;
}複製**
/*====年輕人,瞎搞是出不了省一的,這就是現實====*/
2018 12 1 萬聖節的小L
我回來啦 試題描述 今天是萬聖節,小l同學開始了一年一度的討要糖果遊戲,但是在剛剛過去的比賽中小有成就的他打算給自己增加一點難度 如果沒有討到每一家的糖果就算輸。已知小l共有n n不大於10000 個鄰居,他們都在同一條街上 可以近似看成一條直線 第i個鄰居的座標是xi。l同學的媽媽會在一開始把他送...
萬聖節的小L
萬聖節的小l 題目描述 今天是萬聖節,小l同學開始了一年一度的討要糖果遊戲,但是在剛剛過去的比賽中小有成就的他打算給自己增加一點難度 如果沒有討到每一家的糖果就算輸。已知小l共有n n不大於10000 個鄰居,他們都在同一條街上 可以近似看成一條直線 第i個鄰居的座標是xi。l同學的媽媽會在一開始把...
萬聖節小蜘蛛
故事還得從萬聖節前一天的晚上說起,當時正閒著無聊就去逛df創客社群,於是發現了.這個傢伙 當即就眼前一亮,看樣子製作不難,正好拿來熟悉熟悉3d印表機啊 於是我就斷.斷.斷 續續的開始了 製作三維模型我開始選用的是soildworks2016,上手容易。這裡推薦乙個tinkercad 製作完的蜘蛛模型...