description
題目背景: 尊者神高達進入了基三的世界,作為乙個 mmorpg 做任務是必不可少的,然而跑地圖卻令人十分不爽。好在基三可以使用輕功,但是尊者神高達有些手殘,他決定用梅花樁練習輕功。 題目描述: 一共有 n 個木樁,要求從起點(0)開始,經過所有梅花樁,恰好到達終點 n,尊者神高達一共會 k 種門派的輕功,不同門派的輕功經過的梅花樁數不同,花費時間也不同。但是尊者神高達一次只能使用一種輕功,當他使用別的門派的輕功時,需要花費 w 秒切換(開始時可以是任意門派,不需要更換時間)。由於尊者神高達手殘,所以經過某些梅花樁(包括起點和終點)時他不能使用一些門派的輕功。尊者神高達想知道他最快多久能到達終點如果無解則輸出-1。
input
第一行 n,k,w 接下來 k 行,每行為 ai 和 wi 代表第 i 種輕功花費 vi 秒經過 ai 個木樁。 接下來一行 q 為限制條件數量。 接下來 q 行,每行為 xi 和 ki 代表第 xi 個梅花樁不能使用第 ki 種門派的輕功經過。
output
一行答案即所需最短時間。
sample input
sample input1:
6 2 5
1 13 10
1 12 1
sample input2:
6 2 5
1 13 10
sample output
sample output1:
樣例解釋 1: 先用第二種輕功花費 10 秒到 3,再用 5 秒切換到第一種輕功,最後再用 3 秒時間到 6.一共花費 10+5+3=18 秒
sample output2:
樣例解釋 2:
直接花費 6 秒到 6;
data constraint
20%的資料 n<=20,k<=10,q<=200;
對於另外 20%的資料 w=0
對於另外 20%的資料 q=0
所以資料滿足 n<=500,k<=100,q<=50000,vi<=1e7;
保證資料合法
hint
q:請問第一題可不可以往回跳
a:不可以
–明顯的dp吧
f[i][j]:跳到i木樁,並且最後一次用j輕功跳的最小代價
顯然f[i][j] = min( f[ i - a[j] ][ j ] , f[ i - a[j] ][ k ]+w );
現在只需要處理一下是否能用j輕功跳到i木樁就行了
將j輕功不能跳過的木樁排序
在每個樹樁列舉比較就好了
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
505;
int n,k,w;
int a[maxn]
,v[maxn]
;int q;
vector<
int>no[maxn]
;int c[maxn]
[maxn]
;long
long f[maxn]
[maxn]
,ans;
intmain()
for(
int i=
1;i<=k;i++)}
memset
(f,0x7f
,sizeof
(f))
; ans=f[0]
[0];
for(
int i=
1;i<=k;i++
) f[0]
[i]=0;
for(
int i=
1;i<=n;i++)}
}for
(int i=
1;i<=k;i++
) ans=
min(ans,f[n]
[i]);if
(ans==f[0]
[0])
cout<<-1
;else
cout
}
NOIP2018模擬賽2018 10 18 開荒
description 題目背景 尊者神高達作為乙個萌新,在公升級路上死亡無數次後被乙隻大黃嘰帶回了師門。他加入師門後發現有無窮無盡的師兄弟姐妹,這幾天新副本開了,尊者神高達的師門作為乙個 pve師門,於是他們決定組織一起去開荒。題目描述 師門可以看做以 1 為根的一棵樹,師門中的每乙個人都有一定的...
NOIp2018模擬賽三十六
好久沒打模擬賽了。今天一樣是兩道國集,一道bzoj題 成績 13 0 95 108 a題開始看錯題了。導致樣例都沒看懂,結果xfz提醒我後我理解了乙個我自認為正確的題意 事實證明我和xfz都錯了qwq 然後瞎打了乙個線段樹,結果只有13分。c題一看就是乙個大平衡樹,開始手打了100 行發現自己肯定調...
NOIP2018 信心賽 雞腿
波波手上有許多校慶時分發的雞腿券,他決定用玩遊戲的方式來分配這些雞腿券。已知波波會給出乙個 的 棋盤,並且他會在棋盤的左上角 1,1 處放置乙個棋子。兩名雞腿競爭者 和 將輪流移動棋子,每一回合 選手只能向上 下 左 右四個方向使棋子移動一步。為了使遊戲盡快結束波波還規定不能重複經過已經經過的格 子...