码迷,mamicode.com
首页 > 其他好文 > 详细

[2016-04-17][Gym][100947][C][Rotate It !!]

时间:2016-04-17 17:43:56      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间: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后面偶数位置之和
      • 偶数同理
  • 遇到的问题:

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int maxn = 1E4 + 10;
  5. long long a[maxn],b[maxn];
  6. int main(){
  7. int t;
  8. scanf("%d",&t);
  9. while(t--){
  10. int n,tmp;
  11. long long s[2] = {0};
  12. scanf("%d",&n);
  13. if(!(n&1)){
  14. for(int i = 0; i < n ; ++i){
  15. scanf("%d",&tmp);
  16. s[i&1] += tmp;
  17. }
  18. printf("%I64d\n",max(s[0],s[1]));
  19. }else {
  20. a[0] = b[0] = 0;
  21. for(int i = 1 ; i <= n; ++i){
  22. scanf("%d",&tmp);
  23. if(i & 1){
  24. a[i] = a[i - 1] + tmp;
  25. b[i] = b[i - 1];
  26. }else {
  27. a[i] = a[i - 1];
  28. b[i] = b[i - 1] + tmp;
  29. }
  30. }
  31. long long ans = -1E4 * 1E9;
  32. for(int i = 0 ; i < n ; ++i){
  33. if(i & 1){
  34. ans = max(ans , a[i] + b[n] - b[i]);
  35. }
  36. else{
  37. ans = max(ans , b[i] + a[n] - a[i]);
  38. }
  39. }
  40. printf("%I64d\n",ans);
  41. }
  42. }
  43. return 0;
  44. }




[2016-04-17][Gym][100947][C][Rotate It !!]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/edce65cb92ca410785ded2af02425107.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!