这道题会发现如果一开始确定了整个序列中的最小值,就可以把所有包含他的区间都选上。因为如果最大值在区间内,则不会改变结果(最大值最小值都减一)
最大值不在区间内,正好使得最大值最小值的差变大。
所以枚举一下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\n",num); printf("%d\n",res.size()); for(int i=0;i<res.size();i++) printf("%d ",res[i]); printf("\n"); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。