文章
68
粉丝
691
获赞
26
访问
578.4k
https://blog.csdn.net/csyifanZhang/article/details/106035134
↑ 完整题解
struct E {
ll t, f, h;
}v[MAX];
bool cmp(E e1, E e2) { return e1.t < e2.t; }
ll D, G, maxAlive, minDepart;
ll exist[105][1000][105];//遍历到第i个垃圾,还能苟j小时,高度为k
//当前便利到第k个垃圾,能够活到sur,总高度height
void dfs(ll k, ll sur, ll height) {
if (height >= D) {
if (v[k - 1].t < minDepart)minDepart = v[k - 1].t; return;
}
if (k >= G) return;//没法出去
if (sur < v[k].t)return;//活不到这个垃圾到的时候
if (exist[k][sur][height])return;//重复状态
exist[k][sur][height] = 1;
//两种选择,吃了还是筑高
dfs(k + 1, sur + v[k].f, height);//吃掉
//铸造,此时消耗能量为与下一个垃圾的时间间隔,增高v[k].h
dfs(k + 1, sur, height + v[k].h);
}
int main() {
while (cin >> D >> G) {
maxAlive = 10, minDepart = inf;
memset(exist, 0, sizeof(exist));
for (int i = 0; i < G; i++)
cin >> v[i].t >> v[i].f >> v[i].h, maxAlive += v[i].f;
sort(v, v + G, cmp);
dfs(0, 10, 0);
if (minDepart == inf)c...
登录后发布评论
暂无评论,来抢沙发