寒意


私信TA

用户名:uq_12535881956

访问量:1564

签 名:

等  级
排  名 12599
经  验 965
参赛次数 0
文章发表 3
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:先排序保质期,从大到小,再用小根堆,每一天都选择可选的最便宜的那种巧克力。

天数从最后一天往前循环,用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 人评分

  评论区

卧槽,虽然看不懂,但还是喊一句 大佬!
2022-03-31 20:11:54
  • «
  • 1
  • »