poj1456 - Supermarket

贪心算法

先按照profit从大到小排序

然后从大到小取值尽量使得较大的值放到数组中,如果位置n已经放上了货物则把当前的货物往前放,最终放到空的位置上。

代码如下:

#include <cstdio>
#include <cstdlib>
#include <cstring>
typedef struct {
    int p, d;
}node;
node a[10010];
bool vis[10010];
int comp(const void *sa, const void *sb)
{
    node *aa = (node*)sa, *bb = (node*)sb;
    return bb->p-aa->p;
}
int main ()
{
    int n, ans;
    while(scanf("%d",&n)==1)
    {
        memset(vis,0,sizeof(vis));
        for(int i = 0; i < n; i++) {scanf("%d %d",&a[i].p,&a[i].d);}
        qsort(a,n,sizeof(a[0]),comp);
        ans = 0;
        for(int i = 0; i < n; i++)
        {
            int c = a[i].d;
            if(vis[c]==0) { ans+=a[i].p; vis[c] = 1;}
            else
            {
                for(c = a[i].d-1; c>=1; c--)
                if(vis[c]==0)
                {
                    ans+=a[i].p;
                    vis[c] = 1;
                    break;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(poj1456 - Supermarket)