90分奇怪。。。大佬进
查看原帖
90分奇怪。。。大佬进
125966
VOILinK楼主2021/7/28 15:45

思路是处理最开始和最后的任务,dp状态转移

#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
int n,k,dp[10005],ans=0,rm=1e9;
bool used[10005];
bool vis[10005];
struct node{
	int l,r;
}rw[maxn];
bool cmp(node a,node b){
	if(a.l==b.l) return a.r<b.r;
	return a.l<b.l;
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=k;i++){
		scanf("%d%d",&rw[i].l,&rw[i].r);
		rw[i].r+=rw[i].l-1;
		rm=min(rm,rw[i].r);
	}
	sort(rw+1,rw+k+1,cmp);
	for(int i=1;i<=k;i++){
		if(rw[i].l<=rm){//开始任务 
			dp[i]=rw[i].l-1;
			used[i]=1;
			if(rw[i+1].l!=rw[i].l) rm=-1e9;
		}
		if(used[i]==0) dp[i]=-1e9;//不会做的任务 
		for(int j=i+1;j<=k;j++){
			if(rw[j].l<=rw[i].r) continue;
			vis[i]=1;
			if(dp[i]+rw[j].l-rw[i].r-1>dp[j]){
				used[j]=1;
				dp[j]=dp[i]+rw[j].l-rw[i].r-1;
			}
			//cout<<i<<' '<<j<<' '<<endl;
			if(rw[j+1].l!=rw[j].l) break;
		}
		if(vis[i]==0) dp[i]+=n-rw[i].r;//结束任务 
		ans=max(ans,dp[i]);
	}
	//for(int i=1;i<=k;i++) cout<<used[i]<<' '<<vis[i]<<endl;
	cout<<ans;
}

第六个点错了,输出0。

2021/7/28 15:45
加载中...