Codeforces Round #524 (Div. 2)D - TV Shows

Posted json-five

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #524 (Div. 2)D - TV Shows相关的知识,希望对你有一定的参考价值。

题意是给你n个节目,每次租一台电视需要消耗x+(r-l)*y元,问你怎么样安排才能使得看完所有节目并且消费最少,输出最少的金额

做法是按节目开始时间l排序,遍历所有节目,如果该节目不能在已有的电视上播放或者在已有的电视上播放消耗比再去借一台更多的时候,

那么就再去借一台电视机,当有多个电视机可以播放的时候,贪心选择r最大的电视机.由于是按l升序排序,当(tv[i].l-r)*y>x的时候则表明此时

用已有的电视机播放不如再去借一台,而剩下的l只会更大,所以要erase当前的电视机,否则会超时.PS:WA了好多发,最后发现是开了set没有开multiset,哭了QAQ

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
struct node
{
    ll l,r;
} tv[100005];
bool cmp(node a,node b)
{
    if(a.l==b.l)return a.r<b.r;
    return a.l<b.l;
}
multiset<ll>q;
int main()
{
    ll n,x,y;
    scanf("%lld%lld%lld",&n,&x,&y);
    for (int i=0; i<n; i++ )
    {
        scanf("%lld%lld",&tv[i].l,&tv[i].r);
    }
    sort(tv,tv+n,cmp);
    int cnt=0;
    ll ans=0;
    for (int i=0; i<n; i++ )
    {
        int flag=1;
        auto tmp=q.begin();
        for(auto it=q.begin(); it!=q.end(); )
        {
            ll r=*it;
            if(tv[i].l<=r)
            {
                break;
            }
            if((tv[i].l-r)*y<=x)
            {
                tmp=it;
                flag=0;
                it++;
            }
            else
            {
                q.erase(it);
                it=q.begin();
            }
        }
        if(flag)
        {
            ans=((ans+x)%mod+(y*((tv[i].r-tv[i].l)%mod))%mod)%mod;
            q.insert(tv[i].r);
        }
        else
        {
            ll r=*tmp;
            ans=(ans+(((tv[i].r-r)%mod)*y)%mod)%mod;
            q.erase(tmp);
            q.insert(tv[i].r);
        }
    }
    cout<<ans;
    return 0;
}

  

 

以上是关于Codeforces Round #524 (Div. 2)D - TV Shows的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #524 (Div. 2) codeforces 1080A~1080F

Codeforces Round #524 (Div.2)题解

Codeforces Round #524 (Div. 2)

Codeforces Round #524 Div. 2 翻车记

Codeforces Round #524 (Div. 2)(前3题题解)

Codeforces Round #524 (Div. 2) F