Informe de resolución de problemas: luogu P1280

Enlace al tema: P1280 La misión de Nick
No, es halagador, y luego fue pisoteado.
Considere empujar desde atrás hacia adelante. Si no hay tarea para comenzar aquí, puede tomar un descanso y, de ser así, actualizar el valor en esta ubicación.
Sea \ (dp [i] \) el tiempo máximo de inactividad desde \ (i \) hasta \ (n \) .
Entonces:
Si no hay una tarea inicial aquí:

\ [dp [i] = dp [i + 1] +1 \]

Hay tareas para comenzar:

\ [dp [i] = dp [i + r_i] \]

Por supuesto, "fin" aquí significa terminar en el último minuto de este minuto, lo que puede entenderse como que termina al comienzo del siguiente minuto sin ocupar este minuto.
La complejidad del tiempo es \ (\ mathcal O (n + k) \) , puede pasar esta pregunta.

\ (Código \) :

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

#define MAXN 10005
#define read(x) scanf("%d",&x)  
#define ll long long 

int n,k;
struct node{int l,r;}a[MAXN]; 
int b[MAXN]={0},ans=0,dp[MAXN]={0};

bool cmp(node x,node y){return x.l>y.l;}

int main()
{
	read(n),read(k);
	for(int i=1;i<=k;i++) read(a[i].l),read(a[i].r),b[a[i].l]++;
	sort(a+1,a+k+1,cmp);
	int k=1;
	for(int i=n;i>=1;i--)
	{
		if(!b[i]) dp[i]=dp[i+1]+1;
		else for(int j=1;j<=b[i];j++) dp[i]=max(dp[i],dp[i+a[k].r]),k++;
	}
	printf("%d\n",dp[1]);
	return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/tlx-blog/p/12695533.html
Recomendado
Clasificación