【POJ1456】Supermarket

一道经典的贪心题。

我们不妨将物品按照价值从大到小排序,对于每一个物品,我们尽量让它晚一些被售出,这样得到的答案一定是最优解。

我们可以简单证明一下,首先我们先售出获利较大的物品,这个的正确性是显然的。对于某一个物品,我们最好在时间范围之内让它最晚被售出。为什么呢?因为这个物品在允许范围内的任意时间售出的获利都是相等的,而我们让它最晚售出,就能为之后的物品留出更早的时间,因此之后的物品就更容易被售出。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 using namespace std;
 7 typedef long long ll;
 8 int n;
 9 struct node {
10     int date,val;
11     bool operator <(const node &x) const {
12         return val>x.val;
13     }
14 }a[100010];
15 int vis[100010];
16 int main() {
17     while(cin>>n) {
18         for(int i=1;i<=n;i++)
19             cin>>a[i].val>>a[i].date;
20         sort(a+1,a+n+1);
21         int ans=0;
22         memset(vis,0,sizeof(vis));
23         for(int i=1;i<=n;i++) {
24             for(int j=a[i].date;j;j--) {
25                 if(!vis[j]) {
26                     vis[j]=1;
27                     ans+=a[i].val;
28                     break ;
29                 }
30             }
31         }
32         cout<<ans<<endl;
33     }
34     return 0;
35 }
AC Code
原文地址:https://www.cnblogs.com/shl-blog/p/10803612.html