每日一题之 网易有道算法岗笔试题 (二分)

描述

给一个整数n,n表示贝壳数量,然后A和B轮流取贝壳数,A先手,每次取固定的m个,B后手,每次取剩下贝壳的1/10,向下取整。这样取贝壳直到取完,问A如果要获得至少一半的贝壳,问A最少要取的m数量是多少? n <= 1e18

input
10
output
1

思路:

二分m就好了,按取贝壳方式取,最后判断A获得的贝壳数量是否大于等于总数的一半

#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <cmath>

using namespace std;

const int maxn = 1e6+7;

typedef long long ll;

ll n;

bool judge(ll x)
{
	ll tmp = n;
	ll sum = 0;
	double t = 0;
	while(tmp > 0) {
		if (tmp >= x) {
			sum += x;
			tmp -= x;
		}
		else {
			sum += tmp;
			break;
		}
		//t = (double)tmp;

		tmp = tmp - tmp/10;
	}

	if (sum >= (n+1)/2) return true;
	else
		return false;

}

ll Search(ll low, ll high)
{
	
	while(low < high) {
		ll mid = (low+high)/2;
		if (judge(mid)) {
			high = mid;
		}
		else 
			low = mid + 1;
	}

	return low;
}

int main()
{

	cin >> n;
	
	cout << Search(1,n) << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值