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 公式左对齐 ...
随机推荐
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---14
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- Fio IO性能测试
fio-2.1.2-1.el5.rf.x86_64 介绍 fio different types of I/O engines (sync, mmap, libaio, posixaio, SG v3 ...
- js坑 把数字型的字符串默认为数字 把前面的0给去掉了("001")
<script> b("); function b(id) { console.log("b函数的id:"+id); //var history = &quo ...
- 源码分析——迁移学习Inception V3网络重训练实现图片分类
1. 前言 近些年来,随着以卷积神经网络(CNN)为代表的深度学习在图像识别领域的突破,越来越多的图像识别算法不断涌现.在去年,我们初步成功尝试了图像识别在测试领域的应用:将网站样式错乱问题.无线领域 ...
- 基于Tiny4412的I2C驱动分析
本文以tiny4412平台上到三轴加速度器为例简单分析了Linux下到i2c驱动编程. http://pan.baidu.com/s/1c0H5vRq
- new子类会先运行父类的构造函数
发现子类构造函数运行时,先运行了父类的构造函数.为什么呢? 原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super(); super(): 表示父类的构造函数,并会调用于参数相对应的父类 ...
- selenium遇到不可编辑input和隐藏input如何赋值
js = 'document.getElementsByName("m:csr_mt_gnccspjclfbxd:bmshldID")[0].type="text&quo ...
- supervisor启动sqlmapapi失败 sqlmapapi: ERROR (file is not executable)
问题:在使用supervisor管理sqlmapapi的时候,启动的时候报错: sqlmapapi: ERROR (file is not executable) 解决办法:sudo supervis ...
- MFC中 用Static控件做超链接(可以实现变手形、下划线、字体变色等功能)
1.新建一个基于对话框的工程MyLink,在对话框中拖一个Static控件,ID可改为IDC_SLink. 2.在头文件中添加成员变量: private: CRect m_Rect; CFont* m ...
- EasyMvc入门教程-高级控件说明(20)表格控件
表单与表格是信息化系统里很常见的控件,EasyMvc提供了简单的数据绑定方式(基于Json),看下面的示例: 准备的接口地址代码如下:(该接口适用以下所有例子) public IActionResu ...