2018 12 1 萬聖節的小L

2021-09-02 07:43:48 字數 1298 閱讀 7427

試題描述

今天是萬聖節,小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 製作完的蜘蛛模型...