前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Codeforces Round #535 (Div. 3) E1. Array and Segments (Easy version)(思维+暴力)

Codeforces Round #535 (Div. 3) E1. Array and Segments (Easy version)(思维+暴力)

作者头像
Ch_Zaqdt
发布2019-01-28 11:06:25
4800
发布2019-01-28 11:06:25
举报
文章被收录于专栏:Zaqdt_ACMZaqdt_ACMZaqdt_ACM

题目链接:http://codeforces.com/contest/1108/problem/E1

       题意是给了n个数,m个区间,对于每个区间可以让当前区间内所有数-1,然后问可以挑选任意个区间,求一个最大的max(a[i]) - min(a[i])。

       因为数据范围只有300,所以我们可以枚举最小值和最大值的位置,然后去挑选区间,n^3的时间复杂度是可行的,具体实现过程看呆码中的注释吧。


AC代码:

#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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档