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