-
时间:2016-04-17 16:35:01 星期日
-
题目编号:[2016-04-17][Gym][100947][C][Rotate It !!]
-
题目大意:给定一列数字,从第一个开始取,每隔一个数字取一个数字,有一个操作就是把第一个数字放在最后,可以无限次操作,问最大的取值是多少
-
分析:
- 可以看成一个环,每个环,可以从每个环开始取,问最大的取值是多少
- 数字是偶数个,很简单,直接就是求奇数位置和偶数位置之和的最大值
- 数字是奇数个,
- 分析可以知道,一定有相邻的两个数字在选中的序列中,那么只需要枚举相邻两个序列,计算最大值即可
- 比如样例 1 5 3 2 4
- 刚开始 1 4 相连,然后是 15,一次类推,
- 如果只是看样例的格式,即1 5 3 2 4 来看,设相邻两个数字是i,j,
- 假设i在奇数位置,那么答案就变成i前面奇数位置之和 加上j后面偶数位置之和
- 偶数同理
-
遇到的问题:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1E4 + 10;
long long a[maxn],b[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,tmp;
long long s[2] = {0};
scanf("%d",&n);
if(!(n&1)){
for(int i = 0; i < n ; ++i){
scanf("%d",&tmp);
s[i&1] += tmp;
}
printf("%I64d\n",max(s[0],s[1]));
}else {
a[0] = b[0] = 0;
for(int i = 1 ; i <= n; ++i){
scanf("%d",&tmp);
if(i & 1){
a[i] = a[i - 1] + tmp;
b[i] = b[i - 1];
}else {
a[i] = a[i - 1];
b[i] = b[i - 1] + tmp;
}
}
long long ans = -1E4 * 1E9;
for(int i = 0 ; i < n ; ++i){
if(i & 1){
ans = max(ans , a[i] + b[n] - b[i]);
}
else{
ans = max(ans , b[i] + a[n] - a[i]);
}
}
printf("%I64d\n",ans);
}
}
return 0;
}
时间: 2024-10-01 17:12:59