首先按照最晚售出时间对所有商品排序。然后从最晚售出时间最早的开始考虑。如果在之前还有时间段是空着的,那么我们就把这个商品在那个时间段出售。如果之前没有时间空着了,那么我们在前面找一个价格最小的商品,如果当前商品价值大于最小价值,就替换那个最小价值的商品。如果当前商品价值比之前最小价值还要小,就不替换。
代码如下:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <fstream>
#include <istream>
#include <ostream>
#include <complex>
#include <cstring>
#include <utility>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <new>
#include <set>
#include <map>
using namespace std;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int maxn = 10005;
struct data{int t, p;};
data a[maxn];
int ans[maxn];
bool cmp(data a, data b){
return a.t < b.t;
}
int main()
{
//freopen("1.txt", "r", stdin);
int n;
while (~scanf("%d", &n)){
for (int i = 0; i < n; i++){
scanf("%d%d", &a[i].p, &a[i].t);
}
sort(a, a + n, cmp);
memset(ans, 0, sizeof(ans));
int sum = 0;
for (int i = 0; i < n; i++){
int ok = 0;
for (int j = 1; j <= a[i].t; j++){
if (ans[j] == 0){//如果之前有空余时间,就把当前商品在那个时候出售
ans[j] = a[i].p;
sum += a[i].p;
ok = 1;
break;
}
}
if (!ok){//如果之前没有空余时间,就找到之前价值最小的商品和当前商品比较
int mmin = INF, Index;
for (int j = 1; j <= a[i].t; j++){
if (ans[j] < mmin){
mmin = ans[j];
Index = j;
}
}
if (mmin < a[i].p){
sum = sum - ans[Index] + a[i].p;
ans[Index] = a[i].p;
}
}
}
printf("%d\n", sum);
}
return 0;
}