P8591 『JROI-8』颅脑损伤 2.0 题目为何要按左端点排序
查看原帖
P8591 『JROI-8』颅脑损伤 2.0 题目为何要按左端点排序
525889
德音楼主2022/10/26 21:10

如题,这是我的两次提交记录

按右端点排序

按左端点排序

为何按右端点5分,按左端点AC了?

Code:

#include<bits/stdc++.h>
#define int long long
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
using namespace std;
int n,ok[3010][3010],f[3010],ans=9999999999;
struct node{
	int l,r,len;
}a[3010];
bool cmp(node x,node y){
	return x.r<y.r;
}
signed main(){
	ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>a[i].l>>a[i].r;
    	a[i].len=a[i].r-a[i].l;
	} 
    sort(a+1,a+n+1,cmp);
    a[0].l=a[0].r=-9999999999,a[n+1].l=a[n+1].r=-1*a[0].l;
    for(int i=1;i<=n+1;i++){
    	f[i]=9999999999;
    	int maxl=-9999999999;
    	for(int j=i-1;j>=0;j--){
    		if(a[i].l<=a[j].r){
    			ok[i][j]=true;
    			continue;
			}
			if(a[j+1].r<a[i].l) maxl=Max(maxl,a[j+1].l);
			if(a[j].r<maxl) ok[i][j]=true; 
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=i-1;j>=0;j--){
			if(!ok[i][j]) f[i]=Min(f[i],f[j]+a[i].len);
		}
	}
	for(int i=1;i<=n;i++){
		if(!ok[n+1][i]) ans=Min(f[i],ans);
	}
	cout<<ans;
	return 0;
} 
2022/10/26 21:10
加载中...