POJ

来源:互联网 发布:sql server2005企业版 编辑:程序博客网 时间:2024/05/29 15:36

题意:
商店卖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。  */ 
原创粉丝点击