您的位置:首页 > 其它

POJ - 1456 Supermarket (贪心)

2017-12-10 21:30 309 查看
题意:

商店卖N件东西,每件东西都有个截止时间,在截止时间之前买都可以,商店每天只能卖一件商品。问最大获利。

题解:

用贪心去做,我的做法是先排序找到最大价值的商品,然后放到vis[j]中,表示在第j天中销售这件商品,然后遍历每件商品,

如果发现有一件商品比在j天销售的商品的价值还要高的话就把价值低的移动到前一天,如果前一天比这件价值低的商品的价值高的话就继续往前面放置比较,如此反复即可。

10000*10000,最多1秒多点的时间复杂度, 所以不会TL。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=1e4+7;
struct node
{
int p,d;
}a[MAXN];
int vis[MAXN];
bool cmp(node b,node c)
{
return b.p>c.p;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(vis,0,sizeof(vis));
int MAX=0;
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].p,&a[i].d);
if(a[i].d>MAX)
MAX=a[i].d;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
int x=a[i].p;
for(int j=a[i].d;j>=1;j--)
{
if(x>vis[j])
{
int t=vis[j];
vis[j]=x;
x=t;
}
}
}
int sum=0;
for(int i=1;i<=MAX;i++)
sum+=vis[i];
printf("%d\n",sum);
}
}
/*
我的做法是先排序找到最大价值的商品,然后放到vis[j]中,表示在第j天中销售这件商品,然后遍历每件商品,
如果发现有一件商品比在j天销售的商品的价值还要高的话就把价值低的移动到前一天,如果前一天比这件价值低的商品的价值高的话就继续往前面放置比较,如此反复即可。
10000*10000,最多1秒多点的时间复杂度, 所以不会TL。
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: