#include <iostream> #include <cstdio> #include <algorithm> using namespace std; #define N 10005 struct Product { int profit; int deadline; bool operator < (const Product& rhs) const { return deadline < rhs.deadline; } }; int profit[N]; Product product[N]; int main() { int n; int i, j; while(scanf("%d", &n) != EOF) { int maxDeadline = -1; memset(profit, 0, sizeof(profit)); for(i = 0; i < n; ++i) { scanf("%d%d", &product[i].profit, &product[i].deadline); if(product[i].deadline > maxDeadline) maxDeadline = product[i].deadline; } sort(product, product+n); for (i = 0; i < n; ++i) { if(profit[product[i].deadline] == 0) profit[product[i].deadline] = product[i].profit; else { int value = product[i].profit; int minValue = INT_MAX; int minIndex = -1; for(j = 1; j <= product[i].deadline; ++j) { if(profit[j] == 0) { profit[j] = value; break; } if(profit[j] < minValue) { minValue = profit[j]; minIndex = j; } } if(j > product[i].deadline && value > profit[minIndex]) profit[minIndex] = value; } } int sum = 0; for(i = 1; i <= maxDeadline; ++i) sum += profit[i]; printf("%d/n", sum); } return 0; } 本题还可以用小顶堆优化, 将时间复杂度降到O(N*logN).