题目描述 :
在星海广场环绕𝑛(1≤𝑛≤10)个投资价值为1−10的房子, Alice和Bob轮流收购1
套房子首轮Alice可以任取一套房子拆环, 此后两人只能购买这条链两端的房子
两人希望自身购买的房子投资价值和尽量大, 且都选择对自己最有利的方案
求最终Alice,Bob最终获得的房地产投资价值总和
输入描述:
第一行一个𝑛表示房子的数量
第二行包含𝑛个1−10的数字,表示每套房子的投资价值,数字之间空格分割
输出描述:
输出一行两个数字分别表示Alice和Bob的答案,使用空格分割
示例1:
输入:
3
1 2 3
输出:
4 2
示例2:
输入:
4
1 2 1 2
输出:
4 2
以下为题解,提供参考 ,欢迎提供其他思路。
#include<bits/stdc++.h>
using namespace std;
int Alice=0,Bob=0;
int main()
{
int n;
int temp=0;
int left=0,right=0;
int index=0;
int arr[10];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
if(n==2){
if(arr[0]>=arr[1]){
Alice=arr[0];
Bob=arr[1];
}
else{
Alice=arr[1];
Bob=arr[0];
}
cout<<Alice<<' '<<Bob;
return 0;
}
for(int i=0;i<n;i++)
{
if(arr[i]>temp){
temp=arr[i];
index=i;
}
}
left=index-1;
right=index+1;
Alice+=arr[index];
for(int i=0;i<n-1;i++)
{
if(left<0){
left=n-1;
}
if(right>n-1){
right=0;
}
//Bob
Bob+=(arr[left]>=arr[right])?arr[left--]:arr[right++];
if(left<0){
left=n-1;
}
if(right>n-1){
right=0;
}
if(left==right){
Alice+=arr[left];
break;
}
//Alice
Alice+=(arr[left]>=arr[right])?arr[left--]:arr[right++];
if(left<0){
left=n-1;
}
if(right>n-1){
right=0;
}
if(left==right){
Bob+=arr[left];
break;
}
}
cout<<Alice<<' '<<Bob;
return 0;
}