cf1008 codeforces round #535(div3) E1. Array and Segments (Easy version)

这道题会发现如果一开始确定了整个序列中的最小值,就可以把所有包含他的区间都选上。因为如果最大值在区间内,则不会改变结果(最大值最小值都减一)

最大值不在区间内,正好使得最大值最小值的差变大。

所以枚举一下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("
");
}
原文地址:https://www.cnblogs.com/lishengkangshidatiancai/p/10315116.html