首页 > 其他 > 详细

洛谷 1280 尼克的任务

时间:2019-10-22 21:26:27      阅读:99      评论:0      收藏:0      [点我收藏+]

DP+贪心。

根据开始时间先后排序。

第i时刻的最大空闲时间是和后面i+选择任务的持续时间的时刻有关系的,那么,正着找肯定是不行的,我们来试一下倒着搜。

状态表示:dp[i]代表往前推到i时的最大空闲时间。

转移方程:

(1)本时刻无任务  dp[i]=dp[i+1]+1;         //继承上一个时刻的最大空闲时间后+1

(2)本时刻有任务  dp[i]=max(dp[i],dp[i+a[sum])  //a[sum]表示在这个时刻的任务的持续时间,找出选择哪一个本时刻任务使空闲时间最大化

 

#include<bits/stdc++.h>
using namespace std;
const int N=10000+5;
int f[N],sum[N];
struct node
{
    int p,t;
}a[N];
bool cmp(node x,node y)
{
    return x.p>y.p;
}
int main()
{
    int n,k,num=1;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=k;i++)
    {
        scanf("%d%d",&a[i].p,&a[i].t);
        sum[a[i].p]++;
    }
    sort(a+1,a+1+k,cmp);
    for(int i=n;i>=1;i--)
    {
        if(sum[i]==0)   f[i]=f[i+1]+1;
        else
            for(int j=1;j<=sum[i];j++)
            {
                if(f[i+a[num].t]>f[i])  f[i]=f[i+a[num].t];
                num++;
            }
    }
    printf("%d\n",f[1]);
    return 0;
}

 

洛谷 1280 尼克的任务

原文:https://www.cnblogs.com/Siv0106/p/11722173.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!