AtCoder Beginner Contest 094 D - Binomial Coefficients

根据这个图可以知道,层数越深,它的值总体上时变大的;同一层中,越接近中间位置的数越大。对于本题来说,该怎么考虑呢?

  • 假设,我们拿到了两组数据;

    • 当两组数据的都在同一层时,我们只需要考虑他们哪一个更接近层数*1.0/ 2​,距离越近的数越大

    • 当他们不在同一层中怎么考虑?假设第一组数据比第二组数据大,并且第一组数据的层数还更小,那么有且只有 一种可能,第一组数据更靠近中间。由于这些数据都是从同一个数组中取出来的,所以我们一定可以构造出一组数据:使用第二组的层数,使用第一组的列数;这样的一组数据肯定是最大的,

    • 因此,我们可以得到,最大值一定出现在最后一层靠近中间的位置

代码实现:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
 
int main(){
	int n;
	cin>>n;
	vector<ll> v(n+1);
	
	for(int i=1;i<=n;i++) cin>>v[i];
	
	sort(v.begin()+1,v.end());
	double val = v[n]*1.0/2;//最中间的值
	double mina = 10000000000;
	int ans = v[n-1];
	for(int i=1;i<n;i++){
		if(fabs(val - v[i])<=mina){
			mina = fabs(val - v[i]);
			ans = v[i];
		}
	} 
	cout<<v[n]<<' '<<ans<<'\n';
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值