这个题目的题意有点难搞
题目连接:
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; }