poj1456 - Supermarket

本文介绍了一种基于贪心算法的问题求解方法,通过将问题中的元素按利润从高到低排序,并尝试将每个元素放置到合适的位置来最大化整体收益。文章提供了完整的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心算法

先按照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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值