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 不能被其他連續的 ...