时间: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;}