NOIP2017模擬賽 龍珠(dp 單調佇列優化)

2021-08-10 07:11:35 字數 1590 閱讀 8399

你得到了乙個龍珠雷達,它會告訴你龍珠出現的時間和地點。   

龍珠雷達的畫面是一條水平的數軸,每乙個視窗時間,數軸的某些點上會出現同一種龍珠,每當你獲得其中一顆龍珠,其它龍珠就會消失。下乙個視窗時間,數軸上又會出現另一種龍珠。總共有n個視窗時間,也就是總共有n種龍珠。

假設你會瞬間移動,你從數軸的x點移動到y點,耗時0秒,但是需要耗費|x-y|的體力。同時,挖出一顆龍珠也需要耗費一定的體力。請問,最少耗費多少體力,就可以收集齊所有種類的龍珠。

第一行,三個整數n,m,x,表示共有n個視窗時間,每個視窗時間會出現m個龍珠,x是一開始你所處的位置。 接下來有兩個n*m的矩陣。

對於第乙個矩陣,座標為(i,j)的數字表示第i個視窗時間,第j個龍珠的位置。

對於第二個矩陣,座標為(i,j)的數字表示第i個視窗時間,挖取第j個龍珠所需的體力。 輸出格式 乙個整數,表示所需最小體力

3 2 5

2 3

4 1

1 3

1 1

1 3

4 2f[i][j]=min(f[i-1][k]+abs(wz[i-1][k]-wz[i][j])+cst[i][j]

將此方程式的絕對值展開 可以得到

1.f(i,j)=min(f(i-1,k)-p[i-1][k].wz) || 1<=k<=m )+p[i][j].c+p[i][j].wz

2.f(i,j)=min(f(i-1,k)+p[i-1][k].wz) || 1<=k<=m )+p[i][j].c-p[i][j].wz

因為後者的值固定,所以可以考慮單調佇列,維護乙個wz[i][j]-wz[i-1][k]小於零時時的最小值和wz[i][j]-wz[i-1][k]大於等於零時的最小值

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define inf 1e9

struct node;

bool cmp(node a,node b)

}for(i=1;i<=n;i++)

}for(i=1;i<=n;i++) sort(a[i]+1,a[i]+1+m,cmp);

memset(f,30,sizeof(f));

for(i=1;i<=m;i++) f[1][i]=abs(a[1][i].wz-x)+a[1][i].cst;

for(i=2;i<=n;i++)

f[i][j]=minn+a[i][j].cst+a[i][j].wz;

}minn=inf;

for(j=m,k=m;j>=1;j--)

f[i][j]=min(f[i][j],minn+a[i][j].cst-a[i][j].wz);}}

int ans=inf;

for(i=1;i<=m;i++) ans=min(ans,f[n][i]);

cout

<}

NOIP2017模擬賽14 靈魂畫師

靈魂畫師 題目描述 雖然不知道為什麼,但是你一直想用一種神奇的方式完成一幅畫作。你把n張畫紙鋪成一排,並將它們從1到n編號。你一共有c種顏色可用,這些顏色可以用0到c 1來編號。初始時,所有畫紙的顏色都為1。你一共想進行k次作畫,第i次作畫時,你會等概率隨機地選閉區間 li,ri 內的畫紙的乙個子集...

NOIP2017模擬 鴨舌

題目 小美喜歡吃鴨舌。有乙個 n 個點的樹,每個節點 i 第 i 個點上有 ai 個鴨舌。小美一開始處於 x 號點。每次小美可以選擇乙個與現在的點有邊的點而且那個點還有鴨舌,那麼小美會走到那個點並吃乙個鴨舌。要保證小美最後還是走到 x 號點。問小美最多能吃幾個鴨舌?輸入格式 輸入第一行乙個整數 n ...

NOIP2017模擬 區間

2017.11.3 t1 2032 樣例資料 輸入3 2 1 2 1 1 2 4 5輸出 2 6分析 這道題為什麼要放在t1 考得我懷疑人生。本來也只會暴力找,對於30 的資料我是這樣的 先離散化,再二維陣列記錄所有顏色的在每個位置的字首和,然後四層迴圈暴力查詢。而正解是 先離散化,再把每種顏色的每...