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的进程管理
进程就是正在运行的程序. 一个程序可以对应多个进程,但是一个进程只对应一个程序. 1.进程和进程控制的概念 查看进程状态: w+用户名 查看个别用户的进程 ps -aux 显示系统进程 a:代表 ...
- soc与cpu区别
soc(System on Chip)片上系统cpu只包括运算器和控制器.早期 的系统是指在PCB上有cpu和Nand控制器,LCD控制器之类的控制器,构成一个系统. cpu和这些控制器之间用pcb板 ...
- ftk学习记(label篇)【转】
转自:http://blog.csdn.net/feixiaoxing/article/details/25000093 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎 ...
- 《Linux内核Makefile分析》之 auto.conf, auto.conf.cmd, autoconf.h【转】
转自:http://blog.sina.com.cn/s/blog_87c063060101l25y.html 转载:http://blog.csdn.net/lcw_202/article/deta ...
- [SaltStack] Crontab部署
salt.states.cron 接着早上安静的时间, 在这里梳理下crontab相关的东东, 主要是crontab的统一管理维护, 包括新增, 修改, 下线等等. 下面就详细看下crontab的sl ...
- LeetCode OJ-- Maximum Depth of Binary Tree
https://oj.leetcode.com/problems/maximum-depth-of-binary-tree/ 求二叉树的最大深度 深度优先搜索 /** * Definition for ...
- BZOJ—— 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
http://www.lydsy.com/JudgeOnline/problem.php?id=3402 Description 贝茜在和约翰玩一个“捉迷藏”的游戏. 她正要找出所有适 ...
- codevs——2841 愤怒的LJF(背包)
样例有误! 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description LJF发现ZPC的积分比他高,他很愤怒. 他挤出T ...
- OnChencedChang
(一) 1,布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...
- weight initilzation
1. pytorch提供接口 method 1 torch.nn.init里面有很多初始化分布 import torch.nn.init as init self.conv1 = nn.Conv2d ...