• 【codeforces】【Round#523D】TV shows


    题意:n个节目,每个节目的播放时间为[li,ri],你需要选择一些电视机全部播放这些节目,一台电视机不能同时播放多个节目,选择一个新的电视机代价为x , 如果某台电视机的使用时间为[Li,Ri]需要付出(Ri-Li)*y的代价,问最小的代价;

    题解:
            答案是选由于使用电视播放节目的代价是固定的,所以只需要让浪费的使用时间和选择一个新的电视的代价之和最小即可,左端点排序,对于[li,ri],每次选择前面使得rj<li的rj最大的(lj,rj),将x和(li-rj)*y比较讨论;

            cf的题解里面写了证明,但是我总感觉不太严谨的样子。。。。。

            具体实现用multiset;

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<set>
     4 #include<algorithm>
     5 using namespace std;
     6 const int N=100010 ,mod=1e9+7;
     7 int n,ans,x,y;
     8 struct node{
     9     int x,y;
    10     bool operator <(const node&A)const{
    11         return x == A.x ? y < A.y : x < A.x;
    12     }
    13 }a[N];
    14 multiset<int>s;
    15 multiset<int>::iterator it;
    16 int main(){
    17 //    freopen("D.in","r",stdin);
    18 //    freopen("D.out","w",stdout);
    19     scanf("%d%d%d",&n,&x,&y);
    20     for(int i=1;i<=n;i++){
    21         scanf("%d%d",&a[i].x,&a[i].y);
    22         ans = (ans + 1ll * y * (a[i].y - a[i].x) %mod)%mod;
    23     }
    24     sort(a+1,a+n+1);
    25     for(int i=1;i<=n;i++){
    26         it = s.lower_bound(a[i].x);
    27         if(it==s.begin() || 1ll*(a[i].x-*(--it)) * y >= x){
    28             ans=(ans+x)%mod;
    29             s.insert(a[i].y);
    30         }else{
    31             ans=(ans+1ll*(a[i].x-*it) * y%mod)%mod;
    32             s.erase(it);
    33             s.insert(a[i].y);
    34         }
    35     }
    36     printf("%d
    ",ans);
    37     return 0;
    38 } 
    39  
    View Code

     

  • 相关阅读:
    原生js实现简单的全屏滚动
    原生拖拽js利用localstorage保存位置
    vue组件利用formdata图片预览以及上传
    手机端原生js实现下拉刷新数据
    读啥技术服务支持
    涂鸦壁纸技术服务支持
    JAVA基础面试题
    JAVA编程入门
    DOS常用命令及进制转换
    JS基础(事件的绑定)
  • 原文地址:https://www.cnblogs.com/Paul-Guderian/p/10014571.html
Copyright © 2020-2023  润新知