codeforces 1303B National Project 二分

https://vjudge.net/problem/CodeForces-1303B
在这里插入图片描述
题目大意:你要修一段长度为 n n 的铁路,天气情况为 g g 天好天气、 b b 天坏天气,循环往复。你在好天气修的铁路是好的,坏天气修的铁路是不好的,但是只要保证修的铁路中至少有一半的铁路是好的就行,问最少需要多少天(每天最多修 1 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;
}

发布了677 篇原创文章 · 获赞 30 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/xiji333/article/details/104294730