snoi省選模擬賽 day3t1 路徑規劃

2021-08-14 17:47:15 字數 1347 閱讀 1373

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 保證 有向圖中...