1. 程式人生 > >【POJ 1456】Supermarket【並查集】

【POJ 1456】Supermarket【並查集】

題目大意:

思路:

這道題可以用貪心做。因為保質期前都可以賣,所以為了答案最有,就儘量將商品晚賣一些(即最後一天再賣)。就可以保證能賣出的價值最大。證明就不證了,很顯而易見。
還可以用並查集做。設father[i]表示保質期在第i天的商品必須在第father[i]天前賣完。(因為可能第i天賣另外一個商品,就必須推前賣),那麼初始化為father[i]=1,保證不會出錯。

程式碼:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream> using namespace std; int n,father[10001],sum; struct node { int day,p; //分別表示保質期和價格 }a[10001]; bool cmp(node x,node y) { return x.p>y.p; } int find(int x) { if (father[x]<0) return x; //可以不用再往前了 return father[x]=find(father[x]); } int main() { while
(cin>>n) { memset(father,-1,sizeof(father)); for (int i=1;i<=n;i++) scanf("%d%d",&a[i].p,&a[i].day); sort(a+1,a+1+n,cmp); //按照價格排序 for (int i=1;i<=n;i++) { int day=find(a[i].day); //能賣的最後一天 if (day>0) { father[day]=day-1
; //這天賣這個商品 sum+=a[i].p; } } printf("%d\n",sum); sum=0; } return 0; }