日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷P2466 [SDOI2008] Sue 的小球 题解

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P2466 [SDOI2008] Sue 的小球 题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

洛谷P2466 [SDOI2008] Sue 的小球 題解

題目鏈接:P2466 [SDOI2008] Sue 的小球

題意

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

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

將大海近似的看做 xxx 軸,以 Sue 所在的初始位置作為坐標原點建立一個豎直的平面直角坐標系。

一開始空中有 NNN 個彩蛋,對于第 iii 個彩蛋,他的初始位置用整數坐標 (xi,yi)(x_{i}, y_{i})(xi?,yi?) 表示,游戲開始后,它勻速沿 yyy 軸負方向下落,速度為 viv_{i}vi? 單位距離/單位時間。Sue 的初始位置為 (x0,0)(x_{0}, 0)(x0?,0),Sue 可以沿 xxx 軸的正方向或負方向移動,Sue 的移動速度是 111 單位距離/單位時間,使用秘密武器得到一個彩蛋是瞬間的,得分為當前彩蛋的 yyy 坐標的千分之一。

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

對于 100%100\%100% 的數據,?104≤xi,yi,vi≤104-10^4 \leq x_{i},y_{i},v_{i} \leq 10^4?104xi?,yi?,vi?104N≤1000N \leq 1000N1000

首先先將彩蛋按 xxx 排序

因為可以左右走,可以想到這是一個區間dp

f0/1,i,jf_{0/1,i,j}f0/1,i,j? 表示區間 [i,j][i,j][i,j] 的彩蛋都被收集后的最小花費(代價),0/1表示此時在 iii 還是 jjj

轉移方程?

注意到當前的決策會受到之前決策的影響,也就是當前的時刻我們并不清楚

考慮增加一維?那就是暴力解法了

那怎么處理這個時刻的問題呢?

我們轉化一下剛才的問題,

“當前的決策會受到之前決策的影響”

換句話說,就是當前的決策會影響之后的決策

也就是,現在的時刻會影響之后轉移時的物品價值

考慮每次決策時,就把之后的代價先算進去

wi,jw_{i,j}wi,j? 表示區間 [i,j][i,j][i,j] 對之后決策造成的影響(代價),不難發現
wi,j=∑i=0nvi?∑k=ijvkw_{i,j} = \sum_{i=0}^{n}v_i - \sum_{k=i}^{j}v_k wi,j?=i=0n?vi??k=ij?vk?
顯然可以前綴和優化

當然最重要的是,我們可以很容易地推出轉移方程了
f0,i,j=min?{f0,i+1,j+(xi+1?xi)×(Si+Sn?Sj),f1,i+1,j+(xj?xi)×(Si+Sn?Sj)}f1,i,j=min?{f0,i,j?1+(xj?xi)×(Si?1+Sn?Sj?1),f1,i,j?1+(xj?xj?1)×(Si?1+Sn?S?j?1)}f_{0,i,j}=\min\left\{f_{0,i+1,j}+(x_{i+1}-x_i)\times(S_i+S_n-S_j),f_{1,i+1,j}+(x_j-x_i)\times(S_i+S_n-S_j)\right\} \\f_{1,i,j}=\min\left\{f_{0,i,j-1}+(x_j-x_i)\times(S_{i-1}+S_n-S_{j-1}), f_{1,i,j-1}+(x_j-x_{j-1})\times(S_{i-1}+S_n-S-{j-1})\right\} f0,i,j?=min{f0,i+1,j?+(xi+1??xi?)×(Si?+Sn??Sj?),f1,i+1,j?+(xj??xi?)×(Si?+Sn??Sj?)}f1,i,j?=min{f0,i,j?1?+(xj??xi?)×(Si?1?+Sn??Sj?1?),f1,i,j?1?+(xj??xj?1?)×(Si?1?+Sn??S?j?1)}
其中 Sk=∑i=1kvkS_k = \sum_{i=1}^{k}v_kSk?=i=1k?vk?

時間復雜度 O(n2)O(n^2)O(n2)

答案就是 ∑yi?min?{f0,1,n,f1,1,n}\sum y_i -\min\left\{f_{0,1,n},f_{1,1,n}\right\}yi??min{f0,1,n?,f1,1,n?}

代碼:

#include <iostream> #include <string> #include <vector> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iomanip> using namespace std; #define int long long #define INF 0x3f3f3f3f3f3f3f3f #define N (int)(1e3+15)int n,x0,f0[N][N],f1[N][N]; struct node{int x,y,v;}a[N]; signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// freopen("check.in","r",stdin);// freopen("check.out","w",stdout);cin >> n >> x0;for(int i=1; i<=n; i++) cin >> a[i].x;for(int i=1; i<=n; i++) cin >> a[i].y;for(int i=1; i<=n; i++) cin >> a[i].v;a[++n].x=x0;sort(a+1,a+1+n,[](node a,node b){return a.x<b.x;});memset(f0,0x3f,sizeof(f0));memset(f1,0x3f,sizeof(f1));for(int i=1; i<=n; i++)if(a[i].x==x0){f0[i][i]=f1[i][i]=0;}for(int i=1; i<=n; i++) a[i].v+=a[i-1].v;for(int len=2; len<=n; len++)for(int i=1,j=i+len-1; j<=n; i++,j++){f0[i][j]=min(f0[i+1][j]+(a[i+1].x-a[i].x)*(a[i].v+a[n].v-a[j].v),f1[i+1][j]+(a[j].x-a[i].x)*(a[i].v+a[n].v-a[j].v));f1[i][j]=min(f0[i][j-1]+(a[j].x-a[i].x)*(a[i-1].v+a[n].v-a[j-1].v),f1[i][j-1]+(a[j].x-a[j-1].x)*(a[i-1].v+a[n].v-a[j-1].v));}int sum=0;for(int i=1; i<=n; i++) sum+=a[i].y;cout << fixed << setprecision(3);cout << ((sum-min(f0[1][n],f1[1][n]))/1000.0) << '\n';return 0; }

參考文獻

[1] https://www.luogu.com.cn/blog/Bartholomew/solution-p2466

轉載請說明出處

總結

以上是生活随笔為你收集整理的洛谷P2466 [SDOI2008] Sue 的小球 题解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。