YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

这个题目的题意有点难搞

题目连接:

https://atcoder.jp/contests/abc137/tasks/abc137_d

题目大意:输入n和m 指的是一共有n个输入在m天前一共能赚到的钱为多少,输入x,y,分别指的是在x天后可以赚到y.

题解:贪心。。。这道题错了好多次。

正解:我们用一个vector数组来保存某一天可以赚到的钱,然后倒着枚举就是在最后一天,只能取x=1的最大值,倒数第二天我们们要取x=2和x=1中的最大值,,,,,依次类推

所以我们要借用优先队列:

AC代码:

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1E6+7;
vector<int>ve[N];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        ve[x].push_back(y);
    }
    for(int i=1;i<=m;i++){
        sort(ve[i].begin(),ve[i].end());
    }
    priority_queue<int >que;
    int ans=0;
    for(int i=1;i<=m;i++){
        for(int j=0;j<ve[i].size();j++){
            que.push(ve[i][j]);
        }
        if(que.size()){
                ans+=que.top();
                que.pop();
        }
    }
    cout<<ans<<endl;
    return 0;
} 

 

posted on 2019-09-25 11:14  Target--fly  阅读(238)  评论(0编辑  收藏  举报