解题思路:先排序保质期,从大到小,再用小根堆,每一天都选择可选的最便宜的那种巧克力。
天数从最后一天往前循环,用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分
7 人评分
C语言训练-字符串正反连接 (C语言代码)浏览:727 |
大神老白 (C语言代码)浏览:768 |
大小写转换 (C语言代码)浏览:904 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:806 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:504 |
WU-C语言程序设计教程(第三版)课后习题11.11 (C++代码)(想学链表的可以看看)浏览:1464 |
三角形 (C++代码)递推浏览:825 |
核桃的数量 (C语言代码)浏览:726 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:513 |
星期判断机 (C语言代码)浏览:892 |