2017年360最后一道编程题

A、B两伙马贼意外地在一片沙漠中发现了一处金矿,双方都想独占金矿,
但各自的实力都不足以吞下对方,经过谈判后,
双方同意用一个公平的方式来处理这片金矿。
处理的规则如下:
他们把整个金矿分成n段,由A、B开始轮流从最左端或最右端占据一段,直到分完为止。


马贼A想提前知道他们能分到多少金子,因此请你帮忙计算他们最后各自拥有多少金子?

(两伙马贼均会采取对己方有利的策略)

/*
A、B两伙马贼意外地在一片沙漠中发现了一处金矿,双方都想独占金矿,
但各自的实力都不足以吞下对方,经过谈判后,
双方同意用一个公平的方式来处理这片金矿。
处理的规则如下:
他们把整个金矿分成n段,由A、B开始轮流从最左端或最右端占据一段,直到分完为止。

马贼A想提前知道他们能分到多少金子,因此请你帮忙计算他们最后各自拥有多少金子?
(两伙马贼均会采取对己方有利的策略)
*/ 
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;

vector<int>count(int m, vector<int>nums) {
	int sumA = 0, sumB = 0, flag = 0, temp=0;
	vector<int>answer;
	for (int i = 0; i < m - 1; i += 2) {
		//上次存的索引位置为偶数
		if (flag % 2 == 0) {
			//此时不需要换
			if (sumA + nums[i] >= sumB + nums[i + 1]) {
				sumA += nums[i];
				sumB += nums[i + 1];
			}
			//此时要换
			else if (sumA + nums[i] < sumB + nums[i + 1]) {
				temp = sumA;
				sumA = sumB;
				sumB = temp;
				sumA += nums[i + 1];
				sumB += nums[i];
				flag = i + 1;
			}
		}
		//上次存的索引位置为奇数
		else if (flag % 2 != 0) {
			//此时无需更换
			if (sumA + nums[i + 1] >= sumB + nums[i]) {
				sumA += nums[i + 1];
				sumB += nums[i];
			}
			//此时需要更换
			else if (sumA + nums[i + 1] < sumB + nums[i]) {
				temp = sumA;
				sumA = sumB;
				sumB = temp;
				sumA += nums[i];
				sumB += nums[i + 1];
				flag = i;
			}
		}
	}
	answer.push_back(sumA);
	answer.push_back(sumB);
	return  answer;
}

int main()
{
	cout << "请输入测试组数" << endl;
	int n = 0, m = 0, temp=0;
	vector<int>nums,answer;
	cin >> n;
	while (n) {
		cout << "请输入每组数据的元素个数" << endl;
		cin >> m;
		cout << "请输入每个元素的值" << endl;
		for (int i = 0; i < m; i++) {
			cin >> temp;
			nums.push_back(temp);
		}
		cout << "元素输入完毕" << endl;
		//调用函数
		answer=count(m, nums);
		cout << "马贼A获得的钱币数:" << answer[0]<< endl;
		cout << "马贼B获得的钱币数:" << answer[1] << endl;
		//输出个换行,为了美观
		cout << endl;
		n--;
		nums.clear();
	}
    return 0;
}


上一篇:测试环境Docker发布加速原理


下一篇:栈、队列