【nowcoder 牛客 14553】小明打聯盟

小明打聯盟

網址鏈接:牛客網

題目大意

  • 有三個基本技能施法時間x,y,z,其傷害分別爲a,b,c
  • 有一個大招施法時間爲L,可以釋放的時間爲[L,R],這個區間,其傷害爲 temp + A * i (i爲從L開始的蓄力時間)
  • 求T時間內最大連招傷害

解題思路

可以考慮使用揹包DP思路,將大招L,R的時間點看成兩個獨立的技能,L的傷害爲temp,R的傷害爲temp+(R-L)*A。最後在dp結果求一遍大招最大傷害,求得最優解。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,n) for(int i = 0; i < n; ++i)
#define rep2(i,st,ed) for(int i = st; i < ed; ++i)
#define mk(x,y) make_pair(x,y)
#define pb(x) push_back(x)
const ll mod = 1e9 + 7;
const ll N = 2e5 + 200;
const int INF = 0x3f3f3f3f;
const double eps = 1e-7;


int w[N], v[N];
ll dp[N];
int main(){
	int t;
	while(cin>>t){
		memset(dp, 0, sizeof(dp));
		rep(i,3){
			cin>>w[i]>>v[i];
		}
		ll L,R,temp, A;
		cin>>L>>R>>temp>>A;
		w[3] = L;
		v[3] = temp;
		w[4] = R;
		v[4] = temp + (R-L)*A;
		rep(i,5){
			for(int j = w[i]; j <= t; j++){
				dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
			}
		}
		
		for(int i = L; i <= R; i++){
			dp[t] = max(dp[t], dp[t-i] + temp + (i-L)*A);
		}
		cout<<dp[t]<<endl;
	}

	return 0;
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章