吃巧克力,容器vector、map,容器适配器 priority_queue,算法sort排序

发布时间 2023-03-27 22:33:56作者: 金色的省略号

 

#include <algorithm> 
#include <queue>
#include <map>
#include <vector>
#include <iostream>
using namespace std;

struct chocolate{
    long long a;  // 价格
    long long b;  // 保质期
    long long c;  // 数量
    int id;       // 种类
    bool operator<(const chocolate &choc){   //按保质期排序
        return b > choc.b;
    }
};

struct compare{
    bool operator()(const chocolate &choc1,const chocolate &choc2){   //priority_queue  按价格排序
        return choc1.a > choc2.a;
    }
};

int main()
{    
    //freopen("d:\\1.txt","r",stdin );
    int x, n;           //n 种巧克力,吃 x 天
    long long TP = 0;   //总价 total price
    
    vector<chocolate > vchoc;     //存储各种巧克力,按保质期,用sort排序      //空vector,
    priority_queue<chocolate, vector<chocolate>, compare  > q; //按价格排序 //空队列
    map<int, int > mp;  //键:巧克力种类id,值:为吃掉的该种巧克力的数量    //空map
    
    cin >> x >> n;
    for(int i=1; i<=n; ++i){ //n种巧克力,编号从 1 到 n
        chocolate t;
        t.id = i;               //编号
        cin>> t.a >> t.b >> t.c;//价格、保质期、数量      
        vchoc.push_back( t );
    }
                
    sort(vchoc.begin(),vchoc.end() );//按保质期排序

    for(int i=x,j=0; i>=1; i--)  //从第x天,到第一天
    {      
        while(vchoc[j].b>=i && j<vchoc.size() ){ //所有在该天(第i天),
            q.push(vchoc[j] );                     //在保质期内(vchoc[j].b>=i)的巧克力全部放入优先队列按价格排序,
            j++;                                 //可能会放入 >=0 且 <=n 种巧克力
        }
        
        if(!q.size()){
            cout << "-1" << endl;
            return 0;
        }
        
        chocolate t = q.top(); //取价格最小的巧克力
        mp[t.id]++;            //!!!以该种巧克力的编号为键,一天一个累加该种类的巧克力被吃掉的数量
        TP += t.a; //累加吃掉的巧克力的价格
        
        if(mp[t.id] == t.c ) {//!!!该种巧克力被吃完(被吃掉的数量 与 该种巧克力的数量相等)
             q.pop();    //从优先队列中剔除 
        }                    
    }
        
    cout << TP << endl;
        
    return 0; 
}


/* 10 3
1 6 5
2 7 3
3 10 10 */