孙云球(二分枚举)(AOJ 851)

本文介绍了一款名为孙云球的游戏,该游戏由SLF发明。文中详细解析了如何通过算法计算游戏中特定条件下团队的战斗力,并给出了具体实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接

孙云球

Description
大家一起来玩孙云球吧。
众所周知,孙云球是一种好玩有炫酷的球类游戏,由编程始祖 SLF 发明。但是评价一个
球队的战力是的特殊的,给定 n 个人,每个人的身高是 a[i],每有一个三个人的组合
(x,y,z)满足以下条件即可提供 1 的战斗力。条件如下:
1. a[x] < a[y] < a[z]
2. a[y] – a[x] ≤ a[z] – a[y] ≤ 2 * (a[y] – a[x])
SLF 同志的号召能力非常强大,组建的队伍身高千奇百怪,有 1cm 的也有 100km 的。但是,
他迫切期待他组建的这支球队的战力,你能告诉他吗?

Input
第一行一个数 n,表示球队的人数。
接下来 n 行每行一个数,a[i]表示每个人的身高(1 ≤ a[i]≤ 10^9)

Output
一行一个数,表示 SLF 战队的战斗力。

Sample Input
5
3
1
10
7
4

Sample Output
4

Hint
样例解释:1-3-7, 1-4-7, 4-7-10, and 1-4-10

对于 100%的数据,1 ≤ n ≤ 1000


思路
直接枚举算了一下是1e9数量级的,肯定会超时
结果交上去试了一下竟然过了(760ms),可见数据比较水

考虑二分进行优化
利用c++ stl中的函数lower_bound :

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
注:调用lower_bound之前必须确定序列为有序序列,这也是二分的基础

另外要注意下标的边界情况,有效的范围是0~n-1

代码示例

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000;
int a[maxn+50];
int n;

int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;++i) scanf("%d",&a[i]);
	sort(a,a+n);
	long long ans=0;
	for(int i=0;i<n;++i){
		for(int j=i+1;j<n;++j){
			int l=lower_bound(a,a+n,2*a[j]-a[i])-a;
			int r=lower_bound(a,a+n,3*a[j]-2*a[i])-a;
			if(a[r]>3*a[j]-2*a[i]) --r;
			l=max(l,j+1);
			r=min(r,n-1);
			if(l>n-1) continue;
			ans+=r-l+1; 
		}
	}
	printf("%lld\n",ans);
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值