zoukankan      html  css  js  c++  java
  • lyk

    /*这道题第一眼看的时候,设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*/
  • 相关阅读:
    nginx解决前端跨域配置
    oracle 空表处理
    (转)Oracle修改表空间为自动扩展
    使用silverlight自定义控件时“给定关键字不在字典中”
    arcengine note:
    Jquery CSS 操作
    Jquery Easy-UI 树形菜单的运用
    Easy-UI data-options总结
    数据库 存储过程初探
    ASP.NET 日志的记录(登录日志和异常日志和操作日志)
  • 原文地址:https://www.cnblogs.com/xmex/p/10111439.html
Copyright © 2011-2022 走看看