第一种做法:这种方法,算法复杂性大,重复的递归

#include "stdafx.h"

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<math.h>
#include<iomanip>
#include<numeric>
using namespace std; int getGolds(vector<int> golds); int delGolds(vector<int> golds)
{
if (golds.size() == 1)
{
golds.erase(golds.begin());
return 0;
} int leftNum = golds[0];
vector<int> goldsLeft = golds;
goldsLeft.erase(goldsLeft.begin()); int rightNum = golds[golds.size() - 1];
vector<int> goldsRight = golds;
goldsRight.erase(goldsRight.end() - 1); if (leftNum+delGolds(goldsLeft) > rightNum+delGolds(goldsRight))
{
// cout << "B取:" << *golds.begin() << endl;
golds.erase(golds.begin()); }
else
{
// cout << "B取:" << *(golds.end() - 1) << endl;
golds.erase(golds.end()-1);
}
return getGolds(golds);
} int getGolds(vector<int> golds)
{
if (golds.size() == 1 )
{
return golds[0];
} int leftNum =golds[0];
vector<int> goldsLeft=golds;
goldsLeft.erase(goldsLeft.begin()); int rightNum = golds[golds.size()-1];
vector<int> goldsRight = golds;
goldsRight.erase(goldsRight.end() - 1); return max(leftNum + delGolds(goldsLeft), rightNum + delGolds(goldsRight));
} int main()
{
int T;
cin >> T;
int flag = 1;
while (T != 0)
{
T--;
vector<int> golds;
int n;
cin >> n;
for (int i = 0;i < n;i++)
{
int g;
cin >> g;
golds.push_back(g);
} int aSum = getGolds( golds);
int sum = accumulate(golds.begin(),golds.end(),0);
int bSum = sum - aSum; cout << "Case #" << flag << ": " << aSum << " " << bSum << endl; // cout << "Case #" << flag << ": " << aSumleft << " " << bSumleft << endl;
flag++; } return 0;
}

//第二种做法,还是算法复杂性大

#include "stdafx.h"

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<math.h>
#include<iomanip>
#include<numeric>
#include<list>
#include<deque> using namespace std; int getGolds(vector<int> golds,int sum)
{
if (golds.size() == 1 )
{
return golds[0];
} int leftNum =golds[0];
vector<int> goldsLeft=golds;
goldsLeft.erase(goldsLeft.begin()); int rightNum = golds[golds.size()-1];
vector<int> goldsRight = golds;
goldsRight.erase(goldsRight.end() - 1); return sum -min(getGolds(goldsLeft,sum- leftNum), getGolds(goldsRight, sum - rightNum));
} int main()
{
int T;
cin >> T;
int flag = 1;
while (T != 0)
{
T--;
vector<int> golds;
int n;
int sum=0;
cin >> n;
for (int i = 0;i < n;i++)
{
int g;
cin >> g;
golds.push_back(g);
sum += g;
} int aSum = getGolds( golds,sum); int bSum = sum - aSum; cout << "Case #" << flag << ": " << aSum << " " << bSum << endl; // cout << "Case #" << flag << ": " << aSumleft << " " << bSumleft << endl;
flag++; } return 0;
}

A、B两伙马贼意外地在一片沙漠中发现了一处金矿,双方都想独占金矿,但各自的实力都不足以吞下对方,经过谈判后,双方同意用一个公平的方式来处理这片金矿。处理的规则如下:他们把整个金矿分成n段,由A、B开始轮流从最左端或最右端占据一段,直到分完为止。 马贼A想提前知道他们能分到多少金子,因此请你帮忙计算他们最后各自拥有多少金子?(两伙马贼均会采取对己方有利的策略)的更多相关文章

  1. 话说C++中的左值、纯右值、将亡值

    写在前面 C++中有“左值”.“右值”的概念,C++11以后,又有了“左值”.“纯右值”.“将亡值”的概念.关于这些概念,许多资料上都有介绍,本文在拾人牙慧的基础上又加入了一些自己的一些理解,同时提出 ...

  2. 《转载-两篇很好的文章整合》Android中自定义控件

    两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs ...

  3. Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?

    Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ...

  4. ClassLoader 提供了两个方法用于从装载的类路径中取得资源:

    转:http://cheneyph.iteye.com/blog/831721 ClassLoader 提供了两个方法用于从装载的类路径中取得资源: public URL  getResource ( ...

  5. C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段

    C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...

  6. 取一个整数a从右端开始的4~7位

    题目:取一个整数a从右端开始的4-7位. 程序分析:可以这样考虑: (1)先使a右移4位. (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) (3)将上面二者进行&am ...

  7. Lodop条形码竖条和值右端不对齐的解决方法

    当Lodop条形码设置的宽度比较短,数值比较多的时候,会出现条码的竖条和右端不对齐.个人测试了一下,发现解决办法有三种:1.增加条形码的宽度.2.隐藏条码本身的值,用text文本代替.3.修改条形码下 ...

  8. 在编写wpf界面时候中出现如下错误: 类型引用不明确。至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualStateManager”的类型。请考虑调整程序集 XmlnsDefinition 特性。

    wpf中类型引用不明确.至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualState 你是不是用了WPFToolKit?如果是的,那原因 ...

  9. word中公式居中编号在最右端

    1 显示标尺 2 设置居中制表符 3 在对应位置做标记 首先让公式居中 使用居中制表符在标尺的灰色地带标记位置,1)标记公式位置,鼠标左击 2)标记右边标号位置,注意和右边留有一定边距 4 公式左对齐 ...

随机推荐

  1. 【Linux】可重入函数和线程安全的区别与联系【转】

    转自:http://blog.csdn.net/scenlyf/article/details/52074444 版权声明:本文为博主原创文章,未经博主允许不得转载. *****可重入函数 函数被不同 ...

  2. TensorFlow中文社区---下载与安装

    转自:http://www.tensorfly.cn/tfdoc/get_started/os_setup.html 下载与安装 你可以使用我们提供的二进制包, 或者使用源代码, 安装 TensorF ...

  3. iOS关于本地推送

      不多说 直接上代码 
 NSDate *now = [NSDate date]; UILocalNotification *reminderNotification = [[UILocalNoti ...

  4. [SaltStack] Crontab部署

    salt.states.cron 接着早上安静的时间, 在这里梳理下crontab相关的东东, 主要是crontab的统一管理维护, 包括新增, 修改, 下线等等. 下面就详细看下crontab的sl ...

  5. jquery的toggle动画效果显示隐藏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Codeforces 509E Pretty Song (思维)

    E. Pretty Song                                                            time limit per test:1 seco ...

  7. POJ 1239 Increasing Sequences [DP]

    题意:略. 思路:进行两次dp. 第一次dp从前向后,用dp[x]表示从第x位向前dp[x]位可构成一个数字,且与前面的数组符合题意要求.最后求的dp[n]即为最后一个数字的长度. 而题目还有要求,所 ...

  8. POJ 3710 Christmas Game [博弈]

    题意:略. 思路:这是个删边的博弈游戏. 关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532 学习完预备知识后,这一 ...

  9. luogu P3800 Power收集

    题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了. 然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道她能收集多少P点,然而这个问题她答不 ...

  10. luogu P1616 疯狂的采药

    题目背景 此题为NOIP2005普及组第三题的疯狂版. 此题为纪念LiYuxiang而生. 题目描述 LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的 ...