【2019秋招刷题】牛客:分贝壳
作者:互联网
- 思路:因为牛牛每次取的是剩余贝壳的1/10,所以它取的最多的一次是第一次。
- 但由于妞妞先开始取,所以牛牛取得最多的一次不超过贝壳总数的1/10。
- 这里假设妞妞每次固定取贝壳总数的1/10个,那么最后妞妞手中的贝壳肯定多于牛牛。
- 也就是说,想要达到”妞妞手中贝壳数大于总数的一半,又不想太过分“的话,妞妞每次固定取的贝壳数肯定小于总数的1/10。
- 经过上面的分析,我们发现妞妞每次拿取的贝壳数应该在
1到总数/10之间
,假设贝壳总数为n
,那么m
∈[1,n/10)
。 - 然后我们可以使用二分法逐渐逼近最合适的那个值。
- 如果最终定位到的哪个m值使得妞妞手中的贝壳仍然小于一半,那么直接将m加一作为最终的值即可。
- 需要注意,如果分到最后,剩余的贝壳数量小于m的时候,妞妞可以一次性拿完剩余的贝壳,而当贝壳数量小于10个的时候,牛牛就没办法拿到贝壳了。
#include <iostream>
using namespace std;
int main()
{
long long n;
cin>>n;
long long m = n/10;
long long low = 1,high= m;
long long mid = 1;
while(low < high)
{
mid = (low + high)/2;
long long residue = n;
unsigned long long nocow = 0;
while(residue > 0)
{
if(residue > mid)
{
residue -= mid;
nocow += mid;
}
else
{
nocow += residue;
residue -= residue;
}
residue -= (residue/10);
}
if(nocow > n/2)//应该调小
{
high = mid;
}
else if(nocow < n/2)//应该调大
{
low = mid+1;
mid++;
}
else
{
cout<<mid<<endl;
break;
}
}
if(low == high)
cout<<mid<<endl;
return 0;
}
标签:residue,10,妞妞,贝壳,招刷题,mid,long,牛客,2019 来源: https://blog.csdn.net/C2681595858/article/details/100607054