首页 > 其他分享 >题解 尼克的任务

题解 尼克的任务

时间:2023-10-08 23:14:12浏览次数:33  
标签:题解 LL 任务 max 尼克 空闲

有一种和题解区完全不同的做法。

首先将所有任务按照时间从小到大排序,接着用 \(f_i\) 表示处理前 \(i\) 个任务所能得到的最大空闲时间。

回顾一下需要满足的条件:再某个有任务的时刻,如果尼克是空闲的,就必须从中选择一个任务做。那么我们对于第 \(i\) 个任务,枚举上一个做的任务 \(j\),必须满足的条件是:\(j\) 的结束时间 \(+1\sim\) \(i\) 的开始时间 \(-1\) 没有其他任何事件。并且这样做的价值为 \(len_{j 的结束时间 +1\sim i 的开始时间 -1}\)。

这样做的细节也颇多:由于第一个任务不一定是在时刻 \(1\),所以我们得手动设置一个在时刻 \(0\),长度为 \(1\) 的任务,同理需要在设置一个在时刻 \(k+1\) 的任务。

并且为了,满足所有 \(f\) 解出来都是合法的(即不会出现中间有空闲时间但是没做任务的情况),我们先将所有 \(f\) 设置为极小值,再令 \(f_0=0\) 即可。

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
inline LL read() {
	LL sum=0,flag=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') flag=-1; c=getchar();}
	while(c>='0'&&c<='9') {sum=sum*10+c-'0'; c=getchar();}
	return sum*flag;
}

const int N=1e4+10;
int n,k;
int f[N];
struct node {
	int p,t;
}a[N];

int cmp(node x,node y) {
	return x.p<y.p;
}

int main() {
	// freopen("a.in","r",stdin);
	cin>>k>>n;
	for(int i=1;i<=n;i++) cin>>a[i].p>>a[i].t;
	sort(a+1,a+1+n,cmp);
	a[n+1].p=k+1; a[0].t=1;
	memset(f,-0x3f,sizeof(f));
	f[0]=0;
	for(int i=1;i<=n+1;i++) {
		int lst=0;
		for(int j=i-1;j>=0;j--) {
			if(a[j].p+a[j].t-1<a[i].p) {
				if(lst) {
					if(a[j].p+a[j].t-1>=lst) {
						f[i]=max(f[i],f[j]+max(a[i].p-(a[j].p+a[j].t),0));
					}
				}
				else {
					f[i]=max(f[i],f[j]+max(a[i].p-(a[j].p+a[j].t),0));
				}
			}
			if(!lst&&a[j].p<a[i].p) lst=a[j].p;
		}
	}
	cout<<f[n+1];
	return 0;
}

标签:题解,LL,任务,max,尼克,空闲
From: https://www.cnblogs.com/zhangyuzhe/p/17750410.html

相关文章

  • P7710 [Ynoi2077] stdmxeypz 题解
    P7710[Ynoi2077]stdmxeypz题解我的第一道Ynoi题,体验感不高,调了大半天,最后发现有个地方\(B_1\)写成\(B_2\)了。分析树上问题,明显是要转到树下的,所以DFS序是一定要求的。有关树上距离,所以\(deep\)数组也是一定要求的。所以我们现在把问题转化成了:给你三个序列\(......
  • java中的异步任务处理和Feature接口
    简介Java并发包提供了一套框架,大大简化了执行异步任务所需要的开发。框架引入了“执行服务”的概念,封装了任务执行的细节,对任务提交者而言,他可以关注任务本身,如提交任务、获取结果、取消任务。而不用关注任务执行的细节。基本接口①Runnable和Callable:表示要执行的任务②Exc......
  • 「Round C10 B」间隔 题解
    简要题意本题有\(T\)组数据。给定一个由\(n\)个元素构成的正整数数列\(a_1,a_2,a_3...a_{n-1},a_n\)。问至少需要插入多少个整数才能使得\(a\)的各相邻元素之差相等(不能插入在头尾)。\(a\)数列保证是单调不减的。\(1\len\le10^6,0\lea_i\le10^6,1\leT\le1......
  • 任务1
       task1 #include<stdio.h>intmain(){ printf("O\n"); printf("<H>\n"); printf("II\n"); printf("O\n"); printf("<H>\n"); printf("II\n"); return0;}......
  • DBeaver [安装/问题解决]
     DBeaverMac版软件简介DBeaverMac版是一款专门为开发人员和数据库管理员设计的免费开源通用数据库工具。软件的易用性是它的宗旨,是经过精心设计和开发的数据库管理工具。免费、跨平台、基于开源框架和允许各种扩展写作(插件)。下载地址......
  • Linux系列---【shell脚本-模拟手动跑每天的定时任务】
    问题背景上线的时候经常会遇到这样的问题,上线一个每天跑的定时任务,一般跑最近一年的数据,上线的时候需要手动跑过去最近一年的数据,手动肯定不方便,于是这里写了一个好用的shell脚本,来降本增效。shell脚本#!/bin/bash#设置循环的日期范围start_date="20230801"end_date="20......
  • 并发跑任务:任一失败任务停下
    importjava.util.concurrent.*;publicclassMain{publicstaticvoidmain(String[]args){ExecutorServiceexecutorService=Executors.newFixedThreadPool(5);List<Callable<String>>taskList=newArrayList<>();......
  • 【题解】CodeForces-1874/1875
    CodeForces-1875AJellyfishandUndertale一定是等待降到\(1\)或者能补满到\(a\)时才使用工具,依题意模拟即可。提交记录:Submission-CodeForcesCodeForces-1874AJellyfishandGame这种题目有点思路但是不是很会。赛时第一发写得根据奇偶性判断,\(k\)为偶数错了,然后感......
  • SpringBoot简易任务栏示例
    一、概述现有这样一个需求:前端要求实现类似任务栏的东西(windows电脑的任务栏)。要求:可以向任务栏增加图标、删除图标、给任务栏中的图标排序以及加载任务栏图标列表参考样例图:规律图: 思路:(这里假设任务栏图标列表本身就是一个有序的集合,排序规则按照sort正向排序)......
  • AtCoder Beginner Contest 323 (ABC 323) D、E、F 题解
    AtCoderBeginnerContest323(ABC323)D、E、F题解D题目大意给\(n\)种数\(s_i\),每一种数有\(c_i\)个,每次可以把两个相同的数合并为一个数,问最后会剩下多少数?分析对于每一个数\(s_i\),它最多被分解\(log_2c_i\)次,并且合并出来最大的数的大小小于\(s_i\timesc_i......