zoukankan      html  css  js  c++  java
  • DP 动态规划(P1267尼克任务)

    题目描述:

    尼克每天上班之前都连接上英特网,接受他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成。
    尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束。当尼克到达单位后他就开始干活。如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必须由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成。如果某任务于第P分钟开始,持续时间为T分钟,则该任务会在P+T-1分钟结束时完成。

    输入格式:

    输入数据第一行为整数N和K,(1≤N≤10000,1≤K≤10000)。N表示尼克的工作时间单位为分钟,K表示任务总数。
    接下来共有K行,每一行有两个用空格隔开的整数P和T,表示该任务从第P分钟开始,持续时间为T分钟,其中1〈=P〈=N,1〈=P+T-1〈=N。

    输出:

    仅一行,包含一个整数,表示尼克可能获得的最大空暇时间。

    样例:

    15 6
    1 2
    1 6
    4 11
    8 5
    8 1
    11 5

    输出:

    4

    因为这道题数据范围比较大,采用枚举的话肯定会超时。所以用数组a[i]表示从第i分钟开始到最后一分钟的所能获得的最大空闲时间,决定这个值的因素主要是从第i分钟起到第n分钟选取那几个任务,与i之前的任务没有任何关系。所以初始值a[n+1]=0;然后就倒着推,如果没有任务可以做,那么就多一分钟的空闲时间,如果有任务可以做,就求出最大空闲时间。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int a[110000];
    int s[110000],t[110000];
    int main()
    {
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=k;i++)
        {
            cin>>s[i]>>t[i];
        }
        a[n+1]=0;
        memset(a,0,sizeof(a));
        int j=k;
        for(int i=n;i>=1;i--)
        {
            a[i]=0;
            if(s[j]!=i)
            {
                a[i]=1+a[i+1];
            }
            else
                while(s[j]==i)
                {
                    a[i]=max(a[i],a[i+t[j]]);
                    j--;
                }
        }
        cout<<a[1]<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    hdu 2222 Keywords Search
    Meet and Greet
    hdu 4673
    hdu 4768
    hdu 4747 Mex
    uva 1513 Movie collection
    uva 12299 RMQ with Shifts
    uva 11732 strcmp() Anyone?
    uva 1401
    hdu 1251 统计难题
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/6564334.html
Copyright © 2011-2022 走看看