洛谷P3947 肝活動 狀壓DP

2021-08-20 21:09:46 字數 2476 閱讀 5056

題目描述

這樣的規則對 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行...