zoukankan      html  css  js  c++  java
  • POJ 1456(贪心)

     1 #include <string.h>
     2 #include <iostream>
     3 #include <queue>
     4 #include <stdio.h>
     5 
     6 using namespace std;
     7 
     8 struct product{
     9     int deadline;
    10     int val;
    11     friend bool operator<(product n1,product n2)
    12     {
    13         return n1.val<n2.val;
    14     }
    15 }q;
    16 
    17 bool mark[10005];
    18 
    19 int main()
    20 {
    21    // freopen("in.txt","r",stdin);
    22     priority_queue<product> s;
    23     int m;
    24     while(scanf("%d",&m)!=EOF)
    25     {
    26         for(int i=0;i<m;i++)
    27         {
    28             scanf("%d%d",&q.val,&q.deadline);
    29             s.push(q);
    30         }
    31         memset(mark,true,sizeof(mark));
    32         int ans=0;
    33         while(!s.empty())
    34         {
    35             q=s.top();
    36             s.pop();
    37             for(int i=q.deadline;i>=1;i--)
    38             {
    39                 if(mark[i]) {
    40                     ans+=q.val;
    41                     mark[i]=false;
    42                     break;
    43                 }
    44             }
    45         }
    46         printf("%d
    ",ans);
    47     }
    48     return 0;
    49 }

    http://poj.org/problem?id=1456

    题意:在超市里,每一件物品都是有保质期的,而这个超市每卖一件商品所需要的时间是一天,问,在保质期结束前,可获得的最大利润是多少。

    思路:有人说可以用并查集,但我做的并查集的题目不多,理解也不是很深,所以我也不知道怎么用并查集来做,但是,这道题很明显就是一个贪心的题目,所以我用的贪心的办法做的。首先,把商品按利润从大到小来进行排个序,然后把每一件商品都先试着在截止日期那天卖出去,如果那天被其他的商品占用了的话,那么在往前推一天,这样就可以求出最大利润。

    我是用优先队列来做的。首先构造一个包含截止日期和价值的结构体,并在里面写个判断的操作。

    然后构建一个结构体类的优先队列就可以了。

    由于优先队列不怎么会,然后我还是以为优先队列的队顶是front,其实是top

  • 相关阅读:
    STM32启动BOOT0 BOOT1设置方法
    端口映射
    端口映射
    静态路由配置
    静态路由配置
    NETGEAR路由器登录不上 重新获取ip
    NETGEAR路由器登录不上 重新获取ip
    GSM AT指令 SIM900A TC35
    GSM AT指令 SIM900A TC35
    TTP223 触摸按键
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5713802.html
Copyright © 2011-2022 走看看