題目描述
這樣的規則對 yume 這樣的老玩家來說本應是輕而易舉,但不巧的是 yume 把活動的結束時間記成了活動的開始時間,以至於當他上線躍躍欲試的時候,驚恐地發現活動已經快要結束了。現在他想知道,在剩餘的時間之內,他能否完成所有的歌、達成獎勵的分數線拿到活動卡。為了節省時間,他把這個問題交給了你來解決。請你根據給定的資料,幫他計算出能否在剩餘的時間內達成目標。如果能,請告訴他完成每首歌曲的順序。
輸入格式:
輸入的第一行是三個整數 n, m, t,分別表示規定完成
的歌曲數目、獲得獎勵需要達到的最低分數和距離活動結束剩餘的時間。
接下來有 n 行,第 i 行有乙個字串 si 和兩個整數 ti 和 mi,表示第 i 首歌的歌名為 si,完成第 i 首歌所需要的時間為 ti,第 i 首歌的獎勵開放時間剩餘 mi。保證 ti ≤ mi. 其中資料已按 si 的字典序給出。
輸出格式:
如果在活動結束前 yume 可以完成指定的目標拿到獎勵,則在第一行輸出乙個整數 c,表示在獲得獎勵的前提下,所能夠獲得的分數的最大值;接下來的 n 行中,按照完成歌曲的順序輸出第 i 首歌的歌名。如果有多種可能性,則輸出字典序最小的情況。
如果在活動結束前 yume 不能完成所有的歌曲,輸出 no answer .
no answer
說明
對於 0% 的資料,與測試資料完全相同。
對於 20% 的資料,滿足 n ≤ 5。
對於 40% 的資料,滿足 n ≤ 9。
對於 70% 的資料,滿足 n ≤ 15。
對於 100% 的資料,滿足 n ≤ 22,si 的長度不超過 50. 保證 m, t 和 ti, mi 以及其相加的結果都在 int 的最大範圍內。
另有 10% 的資料滿足 sigma(t1, t2, …, tn) < t.
題目分析
看資料範圍一眼就是狀壓吧
每個狀態中1表示已完成的歌曲,0表示未完成
那麼對於每個狀態i
用d p[
i]
dp[i]
dp[i
]到達狀態i能得到的最大分數
對於每個狀態依次列舉n個歌曲
若當前歌曲還未完成(該位為0)
則計算出在該狀態下完成這個歌曲後的狀態j
以及當前狀態下完成這個歌曲能得的分數sc=
mi−t
i−cu
r[i]
sc=m_i-t_i-cur[i]
sc=mi
−ti
−cur
[i]其中cur
[i
]cur[i]
cur[i]
表示到達當前狀態共花了多少時間
然後更新dp[
j]=m
ax(d
p[j]
,dp[
i]+s
c)
dp[j]=max(dp[j],dp[i]+sc)
dp[j]=
max(
dp[j
],dp
[i]+
sc)同時再開乙個陣列記錄路徑就好了
#include
#include
#include
#include
#include
#include
using
namespace std;
intread()
while
(ss>=
'0'&&ss<=
'9')
return f*x;
}const
int n=55;
const
int mx=
5000010
;int n,m,t;
int tim[n]
,lft[n]
;char name[n]
[n];
int curt[mx]
,dp[mx]
;int pre[mx]
,song[mx]
;int sum;
void
print
(int x)
intmain()
if(sum>t)
//不能完成全部歌曲
int maxn=(1
<;//最終狀態
memset
(dp,-1
,sizeof
(dp));
dp[0]
=0;for
(int i=
0;i<=maxn;i++)}
}if(dp[maxn]
printf
("%d\n"
,dp[maxn]);
print
(maxn)
;return0;
}
洛谷P3947 肝活動
本人是noip2018省二的蒟蒻,最近練習狀壓,總感覺樓下的題解晦澀難懂,我決定自己寫一篇題解造福一下廣大蒟蒻 首先看資料範圍就猜到了狀壓dp 設f i 表示完成狀態i 二進位制位,狀壓 這些歌獲得的獎勵 則答案為f 1 對於乙個狀態i,若第j首歌沒完成,即i 1具體實現請見 1 include 2...
狀壓dp 洛谷P2622
狀壓dp 洛谷p2622 現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j 為1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1的話,如果這盞燈是關的,那麼把它開啟,否則也不管 如果...
洛谷2704 狀壓dp
思路 這個狀壓確實挺強。第i行的不僅僅和i 1行有關係,還和i 2行有關係。一般的思路好像解決不了問題,咋搞?我們定義乙個陣列 dp 105 1 10 1 10 dp i t1 t2 i表示的是當前行,t1表示的是當前行的狀態,t2表示的是i 1行的狀態。假設t3表示的是i 2行的狀態,列舉i 2行...