解题思路:先排序保质期,从大到小,再用小根堆,每一天都选择可选的最便宜的那种巧克力。
天数从最后一天往前循环,用while循环把大于当前天数的巧克力种类放进小根堆。
因为要确认当前巧克力是否全被吃完,所以用一个low数组来存被吃了几块,吃的数量与有的数量相等的时候,去掉堆顶元素,因为排过序,所以加了个id用来看吃了哪种巧克力。
堆里没有元素说明当天没有巧克力能吃,所以输出“-1”即可
注意事项:一定要开long long
参考代码:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef long long LL;
const int N=1000010;
LL n,m,idx,ans,ans1,ans2,low[N];
int prime[N],cnt;
bool st[N];
string z,x;
struct Node
{
int x,y,z,id;
bool operator<(const Node t)const
{
return x<t.x;
}
bool operator>(const Node t)const
{
return x>t.x;
}
}tr[N];
void quick(int l,int r)
{
if(l>=r)
return;
int mid=tr[l+r>>1].y;
int i=l-1,j=r+1;
while(i<j)
{
do
{
i++;
}while(tr[i].y>mid);
do
{
j--;
}while(tr[j].y<mid);
if(i<j)
{
Node temp=tr[i];
tr[i]=tr[j];
tr[j]=temp;
}
}
quick(l,j);quick(j+1,r);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>tr[i].x>>tr[i].y>>tr[i].z;
tr[i].id=i;
}
quick(1,m);
int j=1;
priority_queue<Node,vector<Node>,greater<Node>> q;
for(int i=n;i>=1;i--)
{
while(tr[j].y>=i&&j<=m)
{
q.push(tr[j]);
j++;
}
if(!q.size())
{
cout<<"-1"<<endl;
return 0;
}
Node t=q.top();
low[t.id]++;
ans+=t.x;
if(t.z==low[t.id])
{
q.pop();
}
}
cout<<ans<<endl;
return 0;
}
0.0分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复