你得到了乙個龍珠雷達,它會告訴你龍珠出現的時間和地點。龍珠雷達的畫面是一條水平的數軸,每乙個視窗時間,數軸的某些點上會出現同一種龍珠,每當你獲得其中一顆龍珠,其它龍珠就會消失。下乙個視窗時間,數軸上又會出現另一種龍珠。總共有n個視窗時間,也就是總共有n種龍珠。
假設你會瞬間移動,你從數軸的x點移動到y點,耗時0秒,但是需要耗費|x-y|的體力。同時,挖出一顆龍珠也需要耗費一定的體力。請問,最少耗費多少體力,就可以收集齊所有種類的龍珠。
第一行,三個整數n,m,x,表示共有n個視窗時間,每個視窗時間會出現m個龍珠,x是一開始你所處的位置。 接下來有兩個n*m的矩陣。3 2 5對於第乙個矩陣,座標為(i,j)的數字表示第i個視窗時間,第j個龍珠的位置。
對於第二個矩陣,座標為(i,j)的數字表示第i個視窗時間,挖取第j個龍珠所需的體力。 輸出格式 乙個整數,表示所需最小體力
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 的資料我是這樣的 先離散化,再二維陣列記錄所有顏色的在每個位置的字首和,然後四層迴圈暴力查詢。而正解是 先離散化,再把每種顏色的每...