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;
}

  

猜你喜欢

转载自www.cnblogs.com/Json-Five/p/10010105.html