题目链接:http://codeforces.com/contest/1108/problem/E1
题意是给了n个数,m个区间,对于每个区间可以让当前区间内所有数-1,然后问可以挑选任意个区间,求一个最大的max(a[i]) - min(a[i])。
因为数据范围只有300,所以我们可以枚举最小值和最大值的位置,然后去挑选区间,n^3的时间复杂度是可行的,具体实现过程看呆码中的注释吧。
AC代码:
代码语言:javascript复制#include <bits/stdc .h>
using namespace std;
pair<int,int> p[305];
vector<int> v;
int pre[305], a[305];
int n,m;
int main()
{
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",&p[i].first, &p[i].second);
}
int cnt;
int ans = 0;
for(int i=1;i<=n;i ){ // 枚举最小值的位置
for(int j=1;j<=n;j ){ // 枚举最大值的位置
if(i == j) continue;
cnt = 0; // 记录选了多少个区间
int xx = a[j] - a[i]; // 记录最大值减最小值
for(int k=1;k<=m;k ){ // 枚举区间
if(i >= p[k].first && i <= p[k].second && (j < p[k].first || j > p[k].second)){
// i在区间中 j不在区间中
pre[cnt ] = k;
xx ;
}
}
if(ans < xx){ // 更新最大值以及区间
ans = xx;
v.clear();
for(int i=0;i<cnt;i ) v.push_back(pre[i]);
}
}
}
cout<<ans<<endl;
cout<<v.size()<<endl;
for(int i=0;i<v.size();i ){
cout<<v[i]<<" ";
}
puts("");
return 0;
}