贪心
策略是把商品按价值从大到小排序,价值相同的过期日期大的在前面,设置一个标志数组visited,从过期日期向前依次安排卖的日期
#include <stdio.h> #include <iostream> #include <stack> #include <string> #include <set> #include <memory.h> #include <math.h> #include <algorithm> #include <queue> using namespace std; int N; struct good { int value,data; good( int vv = 0, int dd = 0 ):value(vv), data(dd){} friend bool operator <( const good &a, const good &b ) { if( a.value != b.value ) { return a.value < b.value; } else { return a.data > b.data; } } }; priority_queue <good> GOODS; int visited[100005]; int main() { scanf("%d", &N); int Maxdate = 0; memset(visited, 0, sizeof(visited)); for( int i = 0; i < N; i++ ) { good a; scanf("%d %d", &a.value, &a.data); Maxdate = max( Maxdate, a.data ); GOODS.push(a); } long long ans = 0; while( !GOODS.empty() ) { good now = GOODS.top(); int i; for( i = now.data; i >= 1; i-- ) { if( !visited[i] ) { visited[i] = 1; ans += now.value; break; } else continue; } GOODS.pop(); } printf("%lld\n", ans); return 0; }