zoukankan      html  css  js  c++  java
  • P1280 尼克的任务 线性DP

      

    题目描述

    尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成。

    尼克的一个工作日为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。

    输出格式:

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

    输入输出样例

    输入样例#1: 复制
    15 6
    1 2
    1 6
    4 11
    8 5
    8 1
    11 5
    
    输出样例#1: 复制
    4


    求什么设什么 容易想到 dp【i】为 0-i的最大空闲时间 正序
    但是一个决策点是 任务的开头 而任务又有一个状态为持续时间 所有正序dp兼顾不到所有
    那么就倒叙dp dp【i】为i-m的最大空闲时间
    如果没有遇到任务开头的话 dp【i】=dp【i+1】+1;
    如果遇到任务开头:
    遍历以该时刻为起始点的所有任务 选择最大的
    dp【i】=max(dp【i】,dp【i+该任务的持续时间】)
    为了拿出该时刻的任务 这题可以用一个非常巧妙的预处理:见代码

    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,x,y) for(int i=(x);i<=(y);++i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s)
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 10005
    #define inf -0x3f3f3f3f
    
    struct node
    {
        int s,e;
    }s[N];
    bool cmp(node a,node b)
    {
        return a.s>b.s;
    }
    int sum[N];
    int dp[N];
    
    int main()
    {
        int m,n;
        RII(m,n);
        rep(i,1,n)
        {
            RII(s[i].s,s[i].e);
            sum[s[i].s ]++;
        }
        int cnt=1;
        sort(s+1,s+1+n,cmp);
    
        for(int i=m;i>=1;i--)
        {
            if(sum[i]==0)dp[i]=dp[i+1]+1;
            else
            {
              rep(j,1,sum[i])
              {
                  dp[i]=max(dp[i],dp[i+s[cnt++].e] );//直接这样就好了   因为一开始dp【i】为0
              }
            }
        }
        cout<<dp[1]<<endl;
        return 0;
    }














  • 相关阅读:
    PointToPointNetDevice doesn't support TapBridgeHelper
    NS3系列—10———NS3 NodeContainer
    NS3系列—9———NS3 IP首部校验和
    NS3系列—8———NS3编译运行
    【习题 7-6 UVA
    【Good Bye 2017 C】 New Year and Curling
    【Good Bye 2017 B】 New Year and Buggy Bot
    【Good Bye 2017 A】New Year and Counting Cards
    【Educational Codeforces Round 35 D】Inversion Counting
    【Educational Codeforces Round 35 C】Two Cakes
  • 原文地址:https://www.cnblogs.com/bxd123/p/10508500.html
Copyright © 2011-2022 走看看