Codeforces Round #523 (Div. 2) D - TV Shows ( multiset的使用)

本文介绍了一个算法问题,旨在找到观看一系列电视节目所需的最小成本,考虑到租用电视机的固定费用和每分钟的使用费,以及节目时间重叠的限制。通过排序和集合操作,确保了算法的有效性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给出 n 个电视节目,在你附近有一家电视出租商店。它以 X 元 租一台电视机,每一分钟花费是  y元,如果片段 [li,ri] 和 [lj,rj] 相交,则显示i和j不能同时在一台电视上观看。一旦您开始在某台电视上观看一档节目,直到这个节目结束。

你需要花费最小的花费把它全部看完

 

#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,long long> ii;
const long long mod = 1e9+7;
long long  n,x,y,res;
ii  A[100000];
multiset<long long,greater<long long>> S;//可重复的set
int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin>>n>>x>>y;
  for(int i=0; i<n; ++i) cin>>A[i].first>>A[i].second;
  sort(A,A+n,[](ii a,ii b)
  {
    return a.first<b.first;//起点排序
  });
  for(int i=0; i<n; ++i)
  {
    long long tmp=x+y*(A[i].second-A[i].first);//祖一台新电视观看这一段
    auto it=S.upper_bound(A[i].first);//第一个大于 A[i].first 的数
    if (it!=S.end())
    {
      if (tmp>y*(A[i].second-*it))
      {
        tmp=y*(A[i].second-*it);//拼在一起看
        S.erase(it);//删去
      };
    }
    S.insert(A[i].second);
    res=(res+tmp)%mod;
  }
  cout << res;
  return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值