如题,这是我的两次提交记录
按右端点排序
按左端点排序
为何按右端点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;
}