zoukankan      html  css  js  c++  java
  • 【NOIP模拟赛181007】上网

    题目描述

    假设有n个人要上网,却只有1台电脑可以上网。上网的时间是从1 szw 至 T szw ,szw是sxc,zsx,wl自创的时间单位,至于 szw怎么换算成s,min或h,没有人清楚。依次给出每个人在某个时间段内上网的快乐程度C(必须这个人在整个时间段内都在上网,才能获得快乐程度C,否则,快乐程度是0),请你得到使总的快乐程度达到最大的方案。

    输入

    第1行2个整数n和T,含义如题目所述;

    接下来有n个这样的结构(每两个相邻的结构之间有一空行,且第1个结构和第一行间有一空行):

    第1行一个整数Mi,表示第i个人的时间段的个数;

    接下来有Mi行,每行3个整数Xj,Yj,C,表示第i个人在[Xj,Yj]内上网的快乐程度为C,

    因此有Xj-Yj-1=1,X1=1,Ymi=T,Xj<=Yj。

    输出

    仅输出一行,为总的最大的快乐程度。

    样例输入

    3 10
    
    3
    1 3 6
    4 7 9
    8 10 3
    
    3
    1 3 5
    4 7 10
    8 10 1
    
    4
    1 3 2
    4 8 2
    9 9 6
    10 10 3
    

    样例输出

    25

    提示

    在[1,3]内,安排1上网,快乐程度为6;

    在[4,7]内,安排2上网,快乐程度为10;

    在[8,8]内,不安排;

    在[9,9]内,安排3上网,快乐程度为6;

    在[10,10]内,安排3上网,快乐程度为3;

    这是使总的快乐程度达到最大的方案,对应的值是25。

    【数据范围】

    对于30%的数据,n<=4,所有的Mi<=5,T<=20;

    对于60%的数据,n<=100,所有的Mi<=100,T<=2000;

    对于100%的数据,n<=500,所有的Mi<=500,T<=500000,所有的0<C<=10^9,并保证最终解Max<=10^9。

    代码

    #pragma GCC optimize(1)
    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    #pragma GCC optimize("Ofast")
    #pragma GCC optimize("inline")
    #include<bits/stdc++.h>
    #define rep(i,j,k) for(register int i=(j);i<=(k);++i)
    #define per(i,j,k) for(register int i=(j);i>=(k);--i)
    using namespace std;
    template<class T> inline void read(T &x)
    {
        x=0;
        register char c=getchar();
        register bool f=0;
        while(!isdigit(c))f^=c=='-',c=getchar();
        while(isdigit(c))x=x*10+c-'0',c=getchar();
        if(f)x=-x;
    }
    const int T=500001;
    int n,t,cnt,f[T],tmp;
    struct node{
        int l,r,val;
    }a[T];
    inline bool cmp(node t1,node t2)
    { 
        if(t1.l==t2.l) return t1.r<t2.r;  
        else return t1.l<t2.l;   
    }
    int main()
    {
        read(n),read(t);
        rep(i,1,n)
        {
            read(tmp);
            rep(j,1,tmp)
                read(a[++cnt].l),read(a[cnt].r),read(a[cnt].val);
        }
        sort(a+1,a+cnt+1,cmp);
        register int c=1,now=a[1].l;
        rep(i,1,t)
        {
            f[i]=max(f[i-1],f[i]);
            if(i<now) continue;
            while(a[c].l==now&&c<=cnt) 
                f[a[c].r]=max(f[a[c].r],f[i-1]+a[c].val),c++;
            now=a[c].l;
        }
        printf("%d
    ",f[t]);
        return 0;
    }
  • 相关阅读:
    计算GPS点之间的距离
    C/C++ 获取系统时间 到秒 || 到毫秒
    Qt QLabel QTextBrowser 实现网址链接
    Qt QLabel 显示gif动图
    Qt QDateEdit QDateTimeEdit
    Qt QSpinBox 和 QDoubleSpinBox
    Qt QLineEdit 漂亮的搜索框 && 密码模式 && 格式化输入 && 提示文字 && 选择内容并移动 && 清除全部输入
    Qt QLabel 大小随内容自动变化 && 内容填充整个label空间
    Qt QComBox 文本框输入itemText && 文本框查找item && 本文框添加Item &&设置显示Item数量
    JSON.parse()和JSON.stringify()
  • 原文地址:https://www.cnblogs.com/LJA001162/p/12817139.html
Copyright © 2011-2022 走看看