第36屆北京邀請賽D題 bupt199

2021-05-26 18:09:03 字數 892 閱讀 2571

題意:現在要打怪,白天和晚上打,怪物受到的損害不一樣,白天為pd,晚上為pn。而打了一次怪後,在後面的t小時內不能再打,現在有n天,每天的白天和晚上時間t1,t2不一樣,求怪物受到的最大損害? n<1000,t

<=100,t1,t2在32位表示的範圍內

方法一:這題顯然是dp,因為t1,t2太大,所以不能將它們表示為狀態。因為要損害最大,所以只有前面t小時,後面t小時才有必要決定打不打怪,因為中間肯定是盡量多的打怪的。所以可以開4個二維陣列表示白天前t個小時,後t個小時,晚上前t個小時,後t個小時的狀態就可以了。不過這裡就要注意它是由什麼狀態轉化而來,因為現在這個狀態可能由上幾個天直接轉化而來(當t1,t2太小時),所以我還用了四個陣列標記這狀態是由白天轉化而來,還是晚上。

方法二:前面一方法ac後,發現太煩了,應該可以優化。前面表示的狀態dp[i][j]表示第i個半天,用了j小時(或者後面剩餘j小時)怪物最大的損害。這樣的話,最後狀態間比較的話,如果還剩餘時間,就可以再打一次怪。這就給了啟發,如果我們用狀態dp[i][j]表示向後面借用j小時能給怪造成的最大的損害。那麼列舉借用後面的時間和前面被借用的時間就可以了,但這樣時間複雜度為10^7,tle了。仔細琢磨前面被借用的時刻,只有兩類,要麼前面盡量打(借用後面的時間為t-1),要麼盡量空出後面的時間(最少為0,列舉借用後面的時間後,就可以知道最多可被借用多少時間)。二維的狀態是沒有必要的,可以壓縮成一維。

#include#include#includeusing namespace std;

long long t,a[110],a1[110];//a[i]表示借用後面i小時的最大的受傷。因為迴圈,所以設兩個陣列,分別表示上次和這次

void cal(long long t1,long long pd)

return 0;

}

北京邀請賽 B Beautiful Garden

題意 給你座標和n個點,求最少移動的點使得n個點成等差數列 思路 既然要成等差數列,那麼最起碼有兩個點是不動的,然後列舉這兩個點中間的點的個數,近期水的要死,看了隊友的 做的 include include include include include include using namespac...

2018南昌邀請賽網路賽d題

剛開始看到此提時也沒想到dp 但是仔細一思考可以發現確實是 我們只要單獨處理第一位數 剩下的符號和數字看成乙個物品 進行類似揹包的dp即可 首先預處理所有火柴和符號 根據輸入的總火柴進行一次dp即可 include include include includeusing namespace std...

鞍山邀請賽 部分題

題意 給你n個行星,移動k個行星,繞他們的質心速度變得更大,使得這些行星的速度變得更大,那麼就要使得 i的值更小即可,include include include includeusing namespace std double zb 70100 double sum 70005 double ...