洛谷 P2466 Sue的小球 解題報告

2022-04-30 06:42:05 字數 2314 閱讀 9649

sue和sandy最近迷上了乙個電腦遊戲,這個遊戲的故事發在美麗神秘並且充滿刺激的大海上,sue有一支輕便小巧的小船。然而,sue的目標並不是當乙個海盜,而是要收集空中漂浮的彩蛋,sue有乙個秘密**,只要她將小船劃到乙個彩蛋的正下方,然後使用秘密**便可以在瞬間收集到這個彩蛋。然而,彩蛋有乙個魅力值,這個魅力值會隨著彩蛋在空中降落的時間而降低,sue要想得到更多的分數,必須盡量在魅力值高的時候收集這個彩蛋,而如果乙個彩蛋掉入海中,它的魅力值將會變成乙個負數,但這並不影響sue的興趣,因為每乙個彩蛋都是不同的,sue希望收集到所有的彩蛋。

然而sandy就沒有sue那麼浪漫了,sandy希望得到盡可能多的分數,為了解決這個問題,他先將這個遊戲抽象成了如下模型:

以sue的初始位置所在水平面作為\(x\)軸。

一開始空中有\(n\)個彩蛋,對於第\(i\)個彩蛋,他的初始位置用整數座標\((xi, yi)\)表示,遊戲開始後,它勻速沿\(y\)軸負方向下落,速度為\(v_i\)單位距離/單位時間。sue的初始位置為\((x0, 0)\),sue可以沿x軸的正方向或負方向移動,sue的移動速度是1單位距離/單位時間,使用秘密**得到乙個彩蛋是瞬間的,得分為當前彩蛋的\(y\)座標的千分之一。

現在,sue和sandy請你來幫忙,為了滿足sue和sandy各自的目標,你決定在收集到所有彩蛋的基礎上,得到的分數最高。

第一行為兩個整數\(n\), \(x0\)用乙個空格分隔,表示彩蛋個數與sue的初始位置。

第二行為\(n\)個整數\(x_i\),每兩個數用乙個空格分隔,第\(i\)個數表示第\(i\)個彩蛋的初始橫座標。

第三行為\(n\)個整數\(y_i\),每兩個數用乙個空格分隔,第\(i\)個數表示第\(i\)個彩蛋的初始縱座標。

第四行為\(n\)個整數\(v_i\),每兩個數用乙個空格分隔,第\(i\)個數表示第\(i\)個彩蛋勻速沿\(y\)軸負方向下落的的速度。

乙個實數,保留三位小數,為收集所有彩蛋的基礎上,可以得到最高的分數。

說明對於30%的資料,\(n<=20\)。

對於60%的資料,\(n<=100\)。

對於100%的資料,\(-10^4 <= xi,yi,vi <= 10^4,n < = 1000\)

從暴力開始

我們發現,對於當前時間所處的每乙個位置,我們有且僅有兩個選擇(即向左或向右)

30分到手,\(o(2^n)\)的複雜度。

既然有向左或向右的選擇,很容易聯想到dp上去啊。

令\(dp[i][j]\)代表已經處理左端為\(i\)號彩蛋和右端為\(j\)號彩蛋時的區間所產生的最大分數。

試試寫轉移的話,我們會發現兩個問題。

對於當前位置的資訊我們需要儲存一下,也就是在左端點還是右端點,多開一維維護即可。

對於彩蛋的分數,是和時間掛鉤的,如果想完整的求解,得把時間壓進去啊。

時間壓進去肯定爆了有沒有別的辦法呢?

當然有,每乙個點的最終得分其實不就等於 它的初始得分 減去 它的損失分 嗎

我們嘗試維護這樣乙個損失分的最小值。

對於 每一段轉移的時候 我們都能求出 這段時間內 還沒有得到的彩蛋的分的 損失值

\(dp[i][j][0]=min(dp[i+1][j][0]+(t[i+1].x-t[i].x)*(sumv[i]+sumv[n]-sumv[j]),\)

\(dp[i+1][j][1]+(t[j].x-t[i].x)*(sumv[i]+sumv[n]-sumv[j]));\)

\(dp[i][j][1]=min(dp[i][j-1][0]+(t[j].x-t[i].x)*(sumv[i-1]+sumv[n]-sumv[j-1]),\)

\(dp[i][j-1][1]+(t[j].x-t[j-1].x)*(sumv[i-1]+sumv[n]-sumv[j-1]));\)

其中,\(sumv[i]\)維護的是速度的字首和陣列。

code:

#include #include #include using namespace std;

const int n=1002;

double x0,sumv[n],sumy;

int n;

double dp[n][n][2];

double abs(double x)

struct node

printf("%.3lf\n",(sumy-min(dp[1][n][0],dp[1][n][1]))/1000.0);

return 0;

}

我居然又在離散化(排序)之前求了\(sumv\),還找了許久的錯啊。。。

丟人。。

2018.5.21

洛谷P3372解題報告

題目描述如下 在這裡插入描述 由於是一道模板題就直接給注釋詳細的 include includeusing namespace std typedef long long ll long long int sum 0ll struct node tree 500005 void build ll l...

洛谷P1342 請柬解題報告

求去的路徑與回來的路徑和 1 n m 1000000 1 le n,m le 1000000 1 n,m 1000 000最短路 對於第一次碰到這種模型的oiers,這個地方可以講講的。顯然我們可以暴力跑n遍最短路。但是我們可以這麼想 我們出去是從乙個點到所有其他點,那麼我們能回來也從乙個點到所有其...

洛谷 P1654 OSU 解題報告

osu 是一款群眾喜聞樂見的休閒軟體。我們可以把osu的規則簡化與改編成以下的樣子 一共有 n 次操作,每次操作只有成功與失敗之分,成功對應 1 失敗對應 0 n 次操作對應為 1 個長度為 n 的 01 串。在這個串中連續的 x 個 1 可以貢獻 x 3 的分數,這 x 個 1 不能被其他連續的 ...