这道题会发现如果一开始确定了整个序列中的最小值,就可以把所有包含他的区间都选上。因为如果最大值在区间内,则不会改变结果(最大值最小值都减一)
最大值不在区间内,正好使得最大值最小值的差变大。
所以枚举一下1到n,然后按照贪心策略跑一遍就好啦
#include<bits/stdc++.h> using namespace std; int a[310]; int b[310]; int l[310],r[310]; const int INF=(int)1e9+7; vector<int> res,tmp; int num; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) scanf("%d%d",&l[i],&r[i]); for(int pos=1;pos<=n;pos++) { tmp.clear(); for(int i=1;i<=n;i++) b[i]=a[i]; for(int i=1;i<=m;i++) { if(l[i]<=pos&&r[i]>=pos) { tmp.push_back(i); for(int j=l[i];j<=r[i];j++) { b[j]--; } } } int maxn=-INF,minn=INF; for(int i=1;i<=n;i++) { maxn=max(b[i],maxn); minn=min(b[i],minn); } if(maxn-minn>num) { num=maxn-minn; res=tmp; } } printf("%d ",num); printf("%d ",res.size()); for(int i=0;i<res.size();i++) printf("%d ",res[i]); printf(" "); }