ロボットジャンプ問題2点オーバーフロー

ロボットジャンプ問題の2点

最小値は0で、最大値はH []配列の最大値であり、次に二分法です。

get配列では、累積エネルギーが最大値より大きい場合は1が返されます。それ以外の場合は、エネルギーが累積してオーバーフローし、結果にエラーが発生します。

#include<iostream>
using namespace std;


int h[100005]; 

int n;
int maxx=0;
bool get(int xx)
{
    
    
	long long ene=xx;
	
	for(int i=1;i<=n;i++)
	{
    
    
		ene=(ene+ene-h[i]);
//		cout<<ene<<" "<<i<<endl;
		if(ene<0)
		{
    
    
//			cout<<endl<<"***"<<i<<"****";
			return 0;	
		}
		
		if(ene>maxx)       //!!!!!!!!
			return 1;
		
	}
	
	return 1;	
}

int main()
{
    
    
	
	
	
	cin>>n;
	
	
	for(int i=1;i<=n;i++)
	{
    
    
		scanf("%d",&h[i]);
		maxx=max(maxx,h[i]);
		
	}
	
	int l=0;
	int r=maxx+1;
	
	int mid;
	
//	cout<<get(23);
	
	while(l<r)
	{
    
    
		mid=(l+r)/2;
		
		
		if(get(mid))
		{
    
    
			r=mid;
		}else {
    
    
			l=mid+1;
		}
	}
	
	cout<<l;
	
	
	
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45448563/article/details/113828059
おすすめ