C题:
这个题的数据开到了10^18,很明显不能暴力。正确的做法是从1到n进行二分查找,对于每一个查找的值进行暴力模拟。之前只是单纯的写过二分算法,但并没有在实际做题中应用过。
代码如下:
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<stack>
using namespace std;
#define ll long long
ll n;
ll f(ll x)
{
ll i,j,k;
ll tem=n;
ll sum=0;
while(tem>0)
{
if(tem<x)
{
sum+=tem;
tem-=tem;
}
else
{
tem-=x;
sum+=x;
}
if(tem>=10)
{
ll chi=tem/10;
tem-=chi;
}
}
return sum;
}
int main()
{
ll i,j,k;
cin>>n;
ll l,r;
l=1;
r=n;
ll mid=(l+r)/2;
ll p;
if(n&1)
{
p=(n+1)/2;
}
else
{
p=n/2;
}
while(l<r)
{
mid=(l+r)/2;
if(f(mid)>=(n+1)/2)
{
r=mid;
}
else
{
l=mid+1;
}
}
cout<<r<<endl;
return 0;
}
D题: