kac在數軸上有n片西瓜地。第 i片的座標是x[i](注意 x並沒有排序)。任意兩片西瓜地座標不同。有一天他要給這n片西瓜地澆水。初始他在x[1]的位置。他必須按1..n 的順序澆水,也就是說,必須先去x[1],再去x[2]...最後到x[n](他可以沿著座標軸正方向或者負方向走)。
給西瓜地澆水不需要花費時間。每走1單位的距離需要花費1 的時間。 現在kac為了節約時間 打算建立k個超時空傳送站。如果兩個位置p、q,在這兩處位置都有超時空傳送站,那麼我們可以瞬間轉移過去(從 p到 q或者從q到 p) 。
現在他想知道
如果要給這 n片西瓜地都澆好水,最短需要多少時間?
考場上推了乙個要手寫16個轉移的dp方程直接心態**打了暴力。
首先這個題目套了乙個美麗的套子,讓我們無從設計無後效性的狀態,所以我們可以撥開這個外殼,便可以發現,其實總距離之和這條路被經過的次數有關。所以我們可以用cost[i][j]先來表示排序之後第i和j個位置放了傳送門,經過i,j之間路徑的最小代價。
那麼第一種就是整條路經都在i,j內包含,則為從i直接到j與從i到l,再從r到j的最小值。第二種就是路徑左端點在i.j內,右端點在之外,那麼就是從左端點到j,或者到從左端點到i的最小值了,第三種是右端點在i到j內,左端點在l左側,那麼與第二種同理。
預處理了這樣的陣列,那麼我們就很容易dp了,用dp[i][j]表示考慮到第i個點且第i個點用了
,用了j個任意門的最小距離了,轉移就是列舉前乙個,加上走到的cost即可。
下附ac**。
#include#include#include#include#define maxn 60
using namespace std;
typedef long long ll;
ll n,k;
ll dp[maxn][maxn];
ll x[maxn],b[maxn];
ll cost[maxn][maxn];
int main()
scanf("%lld",&k);
b[n+1]=-12345678900000ll;b[n+2]=12345678900000ll;
sort(b+1,b+1+n+2);
for(ll i=1;i<=n+2;i++)
}} memset(dp,0x3f,sizeof(dp));
dp[1][0]=0;
ll ans=123456764589ll;
for(ll i=2;i<=n+1;i++)
if(i==n+1)
ans=min(ans,dp[i][j]);
} } printf("%lld\n",ans);
}
SNOI省選模擬賽 dat1t3 tree
題意 給定一棵n個點 n 1條邊的樹,樹上的第i條邊有權值w i q次詢問,每次詢問為下列兩種操作之一 1 增加乙個點對 x,y。2 查詢第x條邊權值為y時所有點對之間的距離的最大值。題解 還沒完全想清楚,先占個坑,最近來補。下附暫時沒有想清的ac的 include include include ...
FJ省隊集訓DAY3 T1
思路 我們考慮如果取掉乙個部分,那麼能影響到最優解的只有離它最近的那兩個部分。我講的貌似不是很清楚。還有,蜜汁80分,打死也改不出來。1 include2 include3 include4 include5 include6 struct nodea 1200005 9 struct segmen...
省選模擬賽Day4T3迂迴
problem problem problem problem problem problem problem problem 3 迂迴 tour tour tour tour tour tour 題目描述 題目描述 給定一有向圖,邊長均為 1,求 長度 小於 k的環個數 mod m 保證 有向圖中...