cf--contest1321--B. Journey Planning+存储数组

传送门

http://codeforces.com/contest/1321/problem/B

题意

给定一个数组,求数组中某些集合中元素的和最大值,这些元素要满足一定的关系。
1.如果集合只有一个元素,则其和就是本身。
2.如果不是,则需要满足a[i]-a[j]==i-j.
求这些集合中的最大和是多少?

思路

已知关系a[i]-a[j]==i-j 推出 a[i]-i=a[j]-j;就可以开一个数组来存a[i]-i,使得该集合的所有元素都在a[i]-i这个位置。怎么开这个数组大小才是最重要的,最大值就是410e5-1,最小就是1-210e5,处理1-210e5的方法是加一个4e5就行了,范围变成(210e5,8*4e5).最后求这些数组里面的最大值即可。

AC代码

#include
#include
using namespace std;
const int MAXN=2e5+5;
int arr[MAXN];
long long sum[MAXN*4];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)	scanf("%d",&arr[i]),sum[arr[i]-i+MAXN*2]+=arr[i];
	long long ans=0;
	for(int i=0;i<MAXN*4;i++)	ans=max(ans,sum[i]);
	printf("%lld",ans);
	return 0;
}

你可能感兴趣的:(算法刷题库)