描述
给一个整数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;
}