萬聖節的小L

2022-08-18 21:48:14 字數 1328 閱讀 1579

萬聖節的小l

題目描述:

今天是萬聖節,小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

輸出樣例:

解題思路:

題目一看就是區間dp,但是資料範圍n<=10000,普通的dp[i][j]肯定炸,所以這道題的難點就是狀態轉移,滾動陣列正好能解決這個問題

定義乙個陣列dp[2][100010][2]:

第一維用來滾動,即輪換來記錄上一次的狀態和這一次的狀態 now=last,last^=1

第二維記錄位置

第三維記錄方向(0左,1右)

依題意可得轉移方程

dp[now][j][0]=min(dp[last][j+1][0]+x[j+1]-x[j],dp[last][j+1][1]+x[j+i]-x[j]);

dp[now][j][1]=min(dp[last][j][0]+x[j+i]-x[j],dp[last][j][1]+x[i+j]-x[i+j-1]);

1 #include2 #include3 #include4

#define inf 0x7ffffff

5using

namespace

std;

6int n,now,last,x[10010],d[10010],dp[2][10010][2

],ans;

7int

main()825

}26 ans=min(dp[now][1][0],dp[now][1][1

]);27

if(ans==inf)

28 printf("

no solution");

29else

30 printf("%d"

,ans);

31return0;

32 }

2018 12 1 萬聖節的小L

試題描述 今天是萬聖節,小l同學開始了一年一度的討要糖果遊戲,但是在剛剛過去的比賽中小有成就的他打算給自己增加一點難度 如果沒有討到每一家的糖果就算輸。已知小l共有n n不大於10000 個鄰居,他們都在同一條街上 可以近似看成一條直線 第i個鄰居的座標是xi。l同學的媽媽會在一開始把他送到任意鄰居...

2018 12 1 萬聖節的小L

我回來啦 試題描述 今天是萬聖節,小l同學開始了一年一度的討要糖果遊戲,但是在剛剛過去的比賽中小有成就的他打算給自己增加一點難度 如果沒有討到每一家的糖果就算輸。已知小l共有n n不大於10000 個鄰居,他們都在同一條街上 可以近似看成一條直線 第i個鄰居的座標是xi。l同學的媽媽會在一開始把他送...

萬聖節小蜘蛛

故事還得從萬聖節前一天的晚上說起,當時正閒著無聊就去逛df創客社群,於是發現了.這個傢伙 當即就眼前一亮,看樣子製作不難,正好拿來熟悉熟悉3d印表機啊 於是我就斷.斷.斷 續續的開始了 製作三維模型我開始選用的是soildworks2016,上手容易。這裡推薦乙個tinkercad 製作完的蜘蛛模型...