Gemstone Bracelet
题目描述
mumuchacha是一个爱美的小姑娘,她有一条漂亮的宝石手链,宝石手链上有N个不同的宝石,每一颗宝石都有它特定的魅力值。
mumuchacha每天都把手链戴在手上,她很喜欢抬起手来看她的手链,但是每次都只能看到一部分(M个宝石),因为还有一部分被手臂挡住了,所以她不断的旋转手链,每次转动一颗宝石,使每次看到的宝石都不同,求mumuchacha每次旋转后看到的宝石魅力值之和的最大值。
输入
有多个样例,输入的第一行是样例个数T
每个样例的第一行是两个整数n和m
,(1≤m≤n≤100000)
。
第二行是n个整数a
i
,表示n
个宝石的魅力值(1≤a
i
≤10000)
输出
每行输出一个整数,即魅力值和的最大值
样例输入
2 5 3 1 2 3 4 5 10 4 6 7 4 5 8 4 2 5 9 4
样例输出
12
思路:把线段变成环,类似于最大字段和处理;
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1000010];
int main()
{
memset(a,0,sizeof(a));
int n,m,max=0,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int sum=0;
for(int j=0;j<n+m;j++)//把环解开,变成线段
{
if(j<m)
sum=sum+a[j];//算出第一子段
else if(j<n)
{
sum=sum+a[j]-a[j-m];//超出m时,每增加一个a[i]并减去最后一位,变成新的子段
}
else if(j>=n)
sum=sum+a[j-n]-a[j-m];//超出n-1,减去最后一位,从a[0]继续加
int k=sum;
max=max>k?max:k;
}
printf("%d\n",max);
}
return 0;
}