Best Travel Plans
枚举在哪个城市停止旅行 , 这样我们在路程上花费的时间就确定了 , 同时确定了在活动上花费的时间
对于活动花费的时间,我们贪心选择每一秒的最优值即可
#include <bits/stdc++.h>
using ll = long long;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n,m;
std::cin >> n >> m;
std::vector<int> t(n + 1) , e(n + 1) , d(n + 1);
for(int i = 2 ; i <= n ; ++i)
std::cin >> t[i];
for(int i = 1 ; i <= n ; ++i)
std::cin >> e[i];
for(int i = 1 ; i <= n ; ++i)
std::cin >> d[i];
std::vector<std::vector<int>> p(n + 1);
for(int i = 1 ; i <= n ; ++i) {
for(int j = 0 ; e[i] - j * d[i] > 0 && j <= m; ++j) {
p[i].emplace_back(e[i] - j * d[i]);
}
}
int travel = 0 , ans = 0;
for(int i = 1 ; i <= n ; ++i) { //枚举在哪座城市停止旅行
travel += t[i];
int remain = m - travel;
if(remain <= 0) break;
std::vector<int> pos(n + 1 , 0);
int sum = 0;
for(int j = 1 ; j <= remain ; ++j) { //枚举每一秒时间怎么用
int mx = 0 , id ;
for(int k = 1 ; k <= i ; ++k) {
if(pos[k] > p[k].size() - 1) continue;
if(p[k][pos[k]] > mx) {
mx = p[k][pos[k]] , id = k;
}
}
sum += mx , pos[id]++; //每一个城市的活动都需要连续地接上
}
ans = std::max(ans , sum);
}
std::cout << ans << '\n';
return 0;
}
Hearthstone
想起这个题
\(dp[i][x][y] : 第 i 位法力消耗值为 x , 第 i - 1 为法力消耗值为 y时 , 前 i 位填数的最大幸运值\)
标签:std,int,sum,值为,pos,CAT,CCF,mx From: https://www.cnblogs.com/xqy2003/p/17522468.html