A、B两伙马贼意外地在一片沙漠中发现了一处金矿,双方都想独占金矿,但各自的实力都不足以吞下对方,经过谈判后,双方同意用一个公平的方式来处理这片金矿。处理的规则如下:他们把整个金矿分成n段,由A、B开始轮流从最左端或最右端占据一段,直到分完为止。 马贼A想提前知道他们能分到多少金子,因此请你帮忙计算他们最后各自拥有多少金子?(两伙马贼均会采取对己方有利的策略)
第一种做法:这种方法,算法复杂性大,重复的递归
#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想提前知道他们能分到多少金子,因此请你帮忙计算他们最后各自拥有多少金子?(两伙马贼均会采取对己方有利的策略)的更多相关文章
- 话说C++中的左值、纯右值、将亡值
写在前面 C++中有“左值”.“右值”的概念,C++11以后,又有了“左值”.“纯右值”.“将亡值”的概念.关于这些概念,许多资料上都有介绍,本文在拾人牙慧的基础上又加入了一些自己的一些理解,同时提出 ...
- 《转载-两篇很好的文章整合》Android中自定义控件
两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs ...
- Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?
Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ...
- ClassLoader 提供了两个方法用于从装载的类路径中取得资源:
转:http://cheneyph.iteye.com/blog/831721 ClassLoader 提供了两个方法用于从装载的类路径中取得资源: public URL getResource ( ...
- C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段
C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...
- 取一个整数a从右端开始的4~7位
题目:取一个整数a从右端开始的4-7位. 程序分析:可以这样考虑: (1)先使a右移4位. (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) (3)将上面二者进行&am ...
- Lodop条形码竖条和值右端不对齐的解决方法
当Lodop条形码设置的宽度比较短,数值比较多的时候,会出现条码的竖条和右端不对齐.个人测试了一下,发现解决办法有三种:1.增加条形码的宽度.2.隐藏条码本身的值,用text文本代替.3.修改条形码下 ...
- 在编写wpf界面时候中出现如下错误: 类型引用不明确。至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualStateManager”的类型。请考虑调整程序集 XmlnsDefinition 特性。
wpf中类型引用不明确.至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualState 你是不是用了WPFToolKit?如果是的,那原因 ...
- word中公式居中编号在最右端
1 显示标尺 2 设置居中制表符 3 在对应位置做标记 首先让公式居中 使用居中制表符在标尺的灰色地带标记位置,1)标记公式位置,鼠标左击 2)标记右边标号位置,注意和右边留有一定边距 4 公式左对齐 ...
随机推荐
- 虚拟 router 原理分析
上一节我们创建了虚拟路由器“router_100_101”,并通过 ping 验证了 vlan100 和 vlan101 已经连通. 本节将重点分析其中的原理. 首先我们查看控制节点的 linux b ...
- 控制台或Winform程序中如何编码或解码Server.URLEncode
原文发布时间为:2010-07-10 -- 来源于本人的百度文章 [由搬家工具导入] 在Asp.net中可以使用Server.HTMLEncode和Server.URLEncode 将文本或URL的特 ...
- C#后台无刷新页面弹出alert方法
原文发布时间为:2009-05-17 -- 来源于本人的百度文章 [由搬家工具导入] 无刷新弹出警告: ScriptManager.RegisterStartupScript(this. ...
- mvc filters
1.controller using System; using System.Collections.Generic; using System.Linq; using System.Web; us ...
- 让你的qstardict读单词
作为编程行当的人员,英语是躲不掉的,很多资料英文更加有效,字典就显得尤为重要,我希望字典不但能查到中文意思,还能发生,那就跟我来吧: 一.安装字典程序: pacman -S qstartdic sox ...
- hdu 5475(打破固定思维OR线段树)
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- (6)ASP.NET HttpServerUtility 类
HttpServerUtility 类 提供用于处理 Web 请求的 Helper 方法 https://msdn.microsoft.com/zh-cn/library/system.web.htt ...
- Maven错误“Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:create ”解决
用maven3新建一个项目时,输入的命令如下: mvn archetype:create 出现错误如下: [ERROR] Failed to execute goal org.apache.maven ...
- html特殊字符编码问题导致的细节问题
今天在写前端html时,一个a标签的链接地址,由于链接地址需要给后台传参数,因此带了部分url参数: 在html源码里写的连接地址是: http://域名/bidder/noticesearch?no ...
- Start Developing iOS Apps Today
view types - view常见类型