【POJ 1456】Supermarket【並查集】
阿新 • • 發佈:2019-01-31
題目大意:
思路:
這道題可以用貪心做。因為保質期前都可以賣,所以為了答案最有,就儘量將商品晚賣一些(即最後一天再賣)。就可以保證能賣出的價值最大。證明就不證了,很顯而易見。
還可以用並查集做。設表示保質期在第天的商品必須在第天前賣完。(因為可能第天賣另外一個商品,就必須推前賣),那麼初始化為,保證不會出錯。
程式碼:
#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;
}