首页 > 其他分享 >[刷题笔记] Luogu P1280 尼克的任务

[刷题笔记] Luogu P1280 尼克的任务

时间:2023-08-09 19:45:08浏览次数:45  
标签:int Luogu 空暇 start 任务 P1280 时间 include 刷题

Problem

Analysis

首先,如果一个时间只有一个任务开始,则她必须做。如果一个时间有多个任务开始,她可以选一个去做。我们发现这样的决策是取决于后面的空暇时间,而不是前面。所以在dp的时候需要从后往前搜时间(当然如果从前往后可以跑记搜)

考虑转移,如果一个时间有多个任务开始,则选一个空暇时间最长的,如果一个时间没有任务开始,则空暇时间=上一个时间的空暇时间+1,我们本次转移只是如果到了这个时间,已产生的最大空闲时间,显然不一定会用到,但是我们还是要转移,因为我们并不知道会不会用到。

形式化地,若设\(f_i\)表示后\(i\)个时间地最大空闲时间,则:
\(f_i=max(f_i+last_i)\) (满足\(i\)是一个任务的起点,\(f_i+last_i\)表示该任务的终点,显然如果做这个任务则这个任务中间的空暇时间都不能用了,一定是取终点的空暇时间。
\(f_i=f_{i+1}+1\) (满足\(i\)不是一个任务的起点,用上一步+1进行转移)

具体实现的时候为了方便,可以对任务的开始时间进行排序,设置一个\(pos\)记录当前搜到了哪个任务,由于我们保证任务是有序的,所以\(pos\)的开始时间一定是当前的开始时间,实现的时候更加简便。

至此,本题得解,具体实现见代码。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 100100
using namespace std;
int n,k;
int f[N];
int vis[N];
struct Node
{
    int start,end;
}qwq[N];
bool cmp(Node a,Node b)
{
    return a.start > b.start; //按照start time从大到小排序,因为我们是倒着搜的
}
int num = 1; //pos
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=k;i++)
    {
        scanf("%d%d",&qwq[i].start,&qwq[i].end);
        vis[qwq[i].start] ++; //记录当前时间的start time数量
    }
    sort(qwq+1,qwq+k+1,cmp); //从大到小对任务排序
    for(int i=n;i>=1;i--) //倒着搜
    {
        if(!vis[i]) f[i] = f[i+1]+1; //如果当前时间没有任务开始则用上一步转移
        else
        {
            for(int j=1;j<=vis[i];j++)//当前时间有vis_i个任务
            {
                f[i] = max(f[i],f[i+qwq[num].end]); //状态转移在上文已解释
                num++; //pos++
            }
        }
    }
    cout<<f[1]<<endl; //由于我们是倒着转移的,所以输出也要倒着f_1
    return 0;
}

标签:int,Luogu,空暇,start,任务,P1280,时间,include,刷题
From: https://www.cnblogs.com/SXqwq/p/17617837.html

相关文章

  • Leetcode刷题记录本
    Leetcode刷题记录本ID:1点击查看代码暴力破解法classSolution(object):deftwoSum(self,nums,target):""":typenums:List[int]:typetarget:int:rtype:List[int]""" #暴力破解法fori......
  • luogu P4200 千山鸟飞绝 题解 【一维数组套平衡树】
    目录题目解题思路code题目题目链接解题思路首先,此题有明显的插入、删除、查找,所以必须要使用平衡树。考虑如何使用平衡树维护每个鸟的状态。发现很不方便,因为鸟的位置改变,整个平衡树的值都要修改。考虑针对每个节点开一颗平衡树,这样就有\(3e4\times3e4\)棵树。这显然太多了......
  • 递归反转链表局部[labuladong-刷题打卡 day8]
    写在前面前两天刷题打卡,感觉东哥的代码模板没有题解中的简洁,或者那些极限优化的代码中有很多优化技巧,但今天去感受递归的含义的时候,觉得毕竟我现在是在学习算法,理解算法含义才是学习的意义。至于优化,那是之后的事,所以刷题的时候不必过于追求简洁,就像追求简洁而降低可读性一样属......
  • 【刷题笔记】9. Palindrome Number
    题目Determinewhetheranintegerisapalindrome.Aninteger is a palindromewhenit readsthesamebackwardasforward.Example1:Input:121Output:trueExample2:Input:-121Output:falseExplanation:Fromlefttoright,itreads-121.Fromrightto......
  • 刷题记录(二)
    catcat-new点击主页的一个链接http://61.147.171.105:55571/info?file=Persiancat.txt可能存在任意文件读取漏洞,读取/etc/passwd文件读取当前进程的命令行参数?file=../../proc/self/cmdline,发现有一个通过python启动app.py的命令,得知网站使用的是python的flask框架。读取a......
  • luogu P7352 炉心融解
    记\(f_S\)为所有人以当前信息推断出\(S\)这种情况是否合法,\(g_S\)表示假如真实情况是\(S\),应该有哪些人喊出来了。每一轮中,通过告诉你的\(k\)条消息可以推断出哪些集合不合法,将其\(f_S\)赋为\(0\),然后根据新的\(f_S\),有些人可能可以据此喊了,所以根据新的\(f_S\)更......
  • 【刷题笔记】8. String to Integer (atoi)
    题目Implementthe myAtoi(strings) function,whichconvertsastringtoa32-bitsignedinteger(similartoC/C++'s atoi function).Thealgorithmfor myAtoi(strings) isasfollows:Readinandignoreanyleadingwhitespace.Checkifthenextcharact......
  • 【刷题笔记】7. Reverse Integer
    题目Givena32-bitsignedinteger,reversedigitsofaninteger.Example1:Input:123Output:321Example2:Input:-123Output:-321Example3:Input:120Output:21**Note:**Assumewearedealingwithanenvironmentwhichcouldonlystoreintegerswi......
  • GO语言刷题
    ###GO刷题记录二分法查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:输入:nums......
  • 【题解】Luogu[P9504] 『MGOI』Simple Round I C. 魔法禁林
    Link这题我们发现如果直接去枚举生命和法力值显然是不行的,又看到说最小的生命值,不禁想到最短路,但是怎么跑?我们令经过一条边之前魔力值为\(k\),那么该边的边权为\(\lfloor\dfrac{w}{k}\rfloor\),于是我们讲题目转化为了边权为\(\lfloor\dfrac{w}{k}\rfloor\)时\(s\)到\(t\)......