#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 */
标签:sort,容器,巧克力,include,int,适配器,vchoc,long,排序 From: https://www.cnblogs.com/GoldenEllipsis/p/17263297.html