谁是胜者(winner)

题目描述

        现在有n个人进行决战!他们每个人都有一个战斗力,他们排成一排,战斗力分别为a​1​​,a​2​​,⋯,a​n​​。

        保证n一定是2的幂。每轮战斗,都会把所有人分成人数相同的两部分,然后进行战斗。也就是说,假设现在有x人,左侧x/2个人是左侧团队,右侧x/2个人是右侧团队。然后这两个团队进行决斗,

        决斗的规则是:一个团队的战斗力是这个团队所有人的战斗力的总和。如果两个团队的战斗力相同,那么如果是第奇数轮战斗,那么左侧的团队胜利。如果是第偶数轮战斗,那么右侧的团队胜利。否则战斗力大的团队获胜,战斗力小的团队会失败。失败的团队的所有人都会退场。如果最后只剩一个人,那么这个人就是冠军。

        请你得出最后胜利的人的战斗力。

输入描述

第一行一个整数n,表示有n个人。保证n一定是2的幂。

第二行n个整数a​1​​,a​2​​,⋯,a​n​​,表示每个人的战斗力。

输出描述

输出一个整数,表示最后胜利的人的战斗力。

样例输入1

4
7 1 5 4

样例输出1

5

样例输入2

4
3 2 1 4

样例输出2

3

数据范围

对于40%的数据,1≤n≤1000。

对于100%的数据,1≤n≤10​^5​​,1≤a​i​​≤10^​9​​。

AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[100005];
ll sum[100005];
int main() {
	scanf("%d",&n);
	for(int i=1; i<=n; i++) {//输入的同时求出前n项和 前缀和 
		scanf("%d",&a[i]);
		sum[i]=sum[i-1]+a[i];
	}
	int L=1,R=n,cnt=0;
	while(L<R) {//二分 
		cnt++;//统计轮数,题目相等时判断的要求 
		int mid=(L+R)/2;//取中点,因为n是2的幂,所以肯定能等分 
		ll left=sum[mid]-sum[L-1],right=sum[R]-sum[mid];//左边的区域L~mid 右边的区域mid+1~R 
		if(left<right) L=mid+1;//右边获胜,则继续看右边的情况 
		else if(left>right) R=mid;//左边获胜,则继续看左边的情况 
		else {//相等 
			if(cnt%2==0) L=mid+1;//偶数轮右边获胜 
			else R=mid;//奇数轮左边获胜 
		}
	}
	printf("%d",a[R]);//输出最后获胜的人的编号 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值