蒟蒻求助,wa了#2和#7,内有注释和思路。(又双叒叕debug了一天,铁窗泪)
查看原帖
蒟蒻求助,wa了#2和#7,内有注释和思路。(又双叒叕debug了一天,铁窗泪)
627886
duoaidaoc楼主2022/9/21 13:27

用的是第一种题解的思路,dp[高度] = 累计最大生命

#include<bits/stdc++.h>
using namespace std;
int depth, g;
int t[101], h[101], f[101];
int p[101];//用来给t、h、f数组的下标排序
int dp[200];

bool cmp(int x, int y) {
    return t[x] < t[y];
}

int main() {
    scanf("%d%d", &depth, &g);
    for (int i = 1;i <= g;i++) {
        scanf("%d%d%d", &t[i], &f[i], &h[i]);
        p[i] = i;
    }
    
    //按时间排序,后面诸如t[p[i]]就是排序后的t
    sort(p + 1, p + g + 1, cmp);
    
    //初始化dp为-1
    for (int i = 1;i <= depth;i++) {
        dp[i] = -1;
    }
    dp[0] = 10;
    
    for (int i = 1;i <= g;i++) {
        for (int j = depth - 1; j >= 0;j--) {
        //如果该高度的最大存活时间足够操作这个垃圾
            if (dp[j] >= t[p[i]]) {
            	//这个if把超出洞口的状态也算作和洞口平齐
                if (j + h[p[i]] >= depth) {
                    dp[depth] = dp[j];
                }
                else {
                    dp[j + h[p[i]]] = dp[j];
                }
                dp[j] += f[p[i]];
            }
        //否则什么都不做
        }
        //一旦dp[depth]被改动过,说明可以出去了
        if (dp[depth] >= 0) {
            printf("%d", t[p[i]]);
            return 0;
        }
    }
    //否则输出最长存活时间
    printf("%d", dp[0]);
    return 0;
}
2022/9/21 13:27
加载中...