码迷,mamicode.com
首页 > 其他好文 > 详细

lyk

时间:2018-12-12 23:42:44      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:++   ret   这一   class   image   png   bit   状态转移方程   eof   

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

/*这道题第一眼看的时候,设f[i]表示1--i的最大空闲时间
但是我们又可以发现,i时刻的最大空闲时间和后面选择任务的持续的时间是有关系的
那么我们就用f[i]来表是i——n的最大空闲时间,即倒着找
那么我们就可以推出两个状态转移方程式
(1):这一时刻没有任务,那么就在上一时刻的最大空闲时间+1:f[i]=f[i+1]+1
(2):这一时刻有任务,f[i]=max(f[i],f[i+s[q].t])s[q].t表示在这个时刻的任务的
持续时间,找出选择哪一个本时刻任务使空闲时间最大化
那么既然是倒着搜,从后往前的任务对应的开始时间自然也要反过来,从大到小
排序,在进行状态刷新的时候,q不断计一下已经到哪一个任务了*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 11000;
ll n,k,q=1;
ll a[N],f[N];
struct edge
{
    ll p,t;
} s[N];
bool cmp(edge a,edge b)
{
    return a.p>b.p;
}
int main()
{
    memset(a,0,sizeof(a));
    memset(f,0,sizeof(f));
    cin>>n>>k;
    for(int i=1; i<=k; i++)
    {
        cin>>s[i].p>>s[i].t;
        a[s[i].p]++;
    }
    sort(s+1,s+k+1,cmp);//从大到小 
    for(ll i=n; i>0; i--)//倒着搜 
    {
        if(a[i]==0)
            f[i]=f[i+1]+1;//本时刻无任务 
        else
        {
            for(ll j=1; j<=a[i]; j++)
            {
                f[i]=max(f[i+s[q].t],f[i]);//本时刻有任务 
                q++;//不断记任务进度 
            }
        }
    }
    cout<<n-f[1];//最后只需要把最大空闲时间与总时间做差即可 
    return 0;
}
/*15 6
1 2
1 6
4 11
8 7
8 2
11 5

13*/

 

lyk

标签:++   ret   这一   class   image   png   bit   状态转移方程   eof   

原文地址:https://www.cnblogs.com/xmex/p/10111439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!