https://vjudge.net/problem/CodeForces-1303B
题目大意:你要修一段长度为
n
n
n的铁路,天气情况为
g
g
g天好天气、
b
b
b天坏天气,循环往复。你在好天气修的铁路是好的,坏天气修的铁路是不好的,但是只要保证修的铁路中至少有一半的铁路是好的就行,问最少需要多少天(每天最多修
1
1
1长度的铁路,或者跳过这天)。
思路:直接写二分,考虑的部分比较少。昨晚就是上头了非得写 O ( 1 ) O(1) O(1),然而又菜的写不出来浪费好多时间。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int t;
ll n,g,b;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld",&n,&g,&b);
ll n1=n>>1;
if(n&1)
++n1;
ll l=n,r=(n/g+1)*(g+b),mid;
while(l<=r)
{
mid=l+r>>1;
ll res=mid/(g+b);
ll t1=res*g,t2=res*b;
res=mid%(g+b);
if(res<=g)
t1+=res;
else
t1+=g,t2+=res-g;
if(t1<n1||t1+t2<n)
l=mid+1;
else
r=mid-1;
}
printf("%lld\n",l);
}
return 0;
}
要么就是推出来公式:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int t;
ll n,g,b;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld",&n,&g,&b);
ll res=(n+1)>>1;
ll ans;
if(res%g==0)
ans=(g+b)*(res/g)-b;
else
ans=(g+b)*(res/g)+res%g;
printf("%lld\n",max(ans,n));
}
return 0;
}