#include<bits/stdc++.h>
using namespace std;
// 本题思路:从后往前填充关卡,每次找当前能填的最高分的锦囊
const int N = 1005, M = 1005;
struct Data{
    int score, timee;
    bool use; 
    // use记录锦囊是否用过
} a[M]; 
// a[] 存储锦囊
int ans, n, m; 
int main(){
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; ++i)
        scanf("%d%d", &a[i].timee, &a[i].score);
    
    for(int i = n; i >= 1; --i){ 
    // i枚举的是第i关
        int id = 0; 
        // id存储目前可选锦囊中分数最高的锦囊的下标
        for(int j = 1; j <= m; ++j){ 
        // j枚举的是锦囊的下标
            if(a[j].timee >= i && !a[j].use){ 
            // 这个锦囊在第i个时刻还没有过期
                if(id == 0 || a[j].score > a[id].score)
                    id = j; 
                // 做一次更新操作
            }
        }
        if(id != 0){
            ans += a[id].score;
            a[id].use = true;
        }
    }
    printf("%d\n", ans);
    
    return 0;
}
# 闯关游戏## 题目描述你参加了一个闯关游戏游戏共有 $n$ 关每关你需要挑选一个锦囊游戏开始时你共有 $m$ 个锦囊。锦囊是有有效期的第 $i$ 个锦囊的有效期截至第 $a_i$ 关第 $a_i+1$ 关及以后就再也不能使用这个锦囊。锦囊还有对应的分数第 $i$ 个锦囊的分数是 $b_i$使用这个锦囊过关就可以获得 $b_i$ 的分数;不使用锦囊过关则那一关不获得分数;每个锦囊只能使用至多 $

原文地址: http://www.cveoy.top/t/topic/h6ea 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录