码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-11-23 23:27:04      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:选择   space   for   ==   name   round   bre   多个   bool   

题意是给你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

标签:选择   space   for   ==   name   round   bre   多个   bool   

原文地址:https://www.cnblogs.com/Json-Five/p/10010105.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!