洛谷 1280 尼克的任务

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
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 尼克的任务)