二分 —— 基本算法刷题路程

一、1.求阶乘 - 蓝桥云课

算法代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define  ll long long
ll check(ll n)
{
    ll cnt=0;
    while(n)
    {
        cnt+=(n/=5);
    }
    return cnt;
}

int main()
{
    ll k;
    cin>>k;
    ll L=0,R=1e19;
    while(L<R)
    {
        ll mid=(L+R)>>1;
        if(check(mid)>=k)
        {
            R=mid;
        }
        else
        {
            L=mid+1;
        }
    }  
    if(check(R)==k)
    {
        cout<<R;
    }
    else
    {
        cout<<-1;
    }
    return 0;
}

二、1.青蛙过河 - 蓝桥云课

算法代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n,x;
int h[100005];
int sum[100005];

bool check(int mid)
{
    for(int i=1;i<n-mid+1;i++)
    {
        if(sum[i+mid-1]-sum[i-1]<2*x)
        {
            return false;
        }
    }
    return true;
}

int main()
{
    cin>>n>>x;
    sum[0]=0;
    for(int i=1;i<n;i++)
    {
        cin>>h[i];
        sum[i]=sum[i-1]+h[i];
    }
    int L=1,R=n;
    while(L<R)
    {
        int mid=(L+R)/2;
        if(check(mid))
        {
            R=mid;
        }
        else
        {
            L=mid+1;
        }
    }
    cout<<L;
    return 0;
}

三、1.管道 - 蓝桥云课

算法代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int LEN=1e9;
int n,len;
int L[N],S[N];

bool check(int t)
{
    int cnt=0;
    int last_L=2,last_R=1;
    for(int i=0;i<n;i++)
    {
        if(t>=S[i])
        {
            cnt++;
            int left=L[i]-(t-S[i]);
            int right=L[i]+(t-S[i]);
            if(left<last_L)
            {
                last_L=left,last_R=max(last_R,right);
            }
            else if(left<=last_R+1)
            {
                last_R=max(last_R,right);
            }
        }
    }
    if(cnt==0)
    {
        return false;
    }
    if(last_L<=1&&last_R>=len)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    scanf("%d%d",&n,&len);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&L[i],&S[i]);
    }
    int LL=0,R=2e9,ans=-1;
    while(LL<=R)
    {
        int mid=((R-LL)>>1)+LL;
        if(check(mid))
        {
            ans=mid,R=mid-1;
        }
        else
        {
            LL=mid+1;
        }
    }
    printf("%d\n",ans);
    return 0;
}

四、1.技能升级 - 蓝桥云课

算法代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;    // Note: long long is needed
const int N = 100100;
int a[N], b[N];    // Store a_i, b_i
int n, m;

bool check(ll mid) {    // Check if the last skill upgrade can reach mid
    ll cnt = 0;
    for (int i = 0; i < n; ++i) {
        if (a[i] < mid)
            continue;    // Initial value of skill i is less than mid, skip
        cnt += (a[i] - mid) / b[i] + 1;    // Number of times skill i is used
        if (cnt >= m)    // Total upgrades ≥ m, mid is too small
            return true;
    }
    return false;    // Total upgrades < m, mid is too large
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; ++i)
        cin >> a[i] >> b[i];
    ll L = 1, R = 1000000;    // Binary search for the highest possible last attack
    while (L <= R) {
        ll mid = (L + R) / 2;
        if (check(mid)) L = mid + 1;    // Increase mid
        else R = mid - 1;    // Decrease mid
    }
    ll attack = 0;
    ll cnt = m;
    for (int i = 0; i < n; ++i) {
        if (a[i] < R) continue;
        ll t = (a[i] - L) / b[i] + 1;    // Number of upgrades for skill i
        if (a[i] - b[i] * (t - 1) == R)
            t -= 1;    // If skill's upgrade equals R exactly, other skills are better
        attack += (a[i] * 2 - (t - 1) * b[i]) * t / 2;
        cnt -= t;
    }
    cout << attack + cnt * R << endl;
    return 0;
}
相关推荐
esop轻Mes看板亮灯分拣ESD静电安44 分钟前
产线“最后一米”的破局密码:ESOP与MES的区别与深度协同
算法
动词ing1 小时前
[题目练习】三数之和
数据结构
陈天伟教授1 小时前
《数据处理和标注技术》课程能力图谱
人工智能·算法
LMT_Lanmantech1 小时前
HyperWorks许可:almutil显示Unit满了,数据到底准不准?
运维·服务器·算法
YSL0701241 小时前
一文通关-----栈和队列
开发语言·数据结构
禁默1 小时前
论文解读与思考:基于场所地图的标识感知机器人探索方法及工程参考的价值
人工智能·深度学习·算法·机器人
维克兜率天1 小时前
【维克】统计套利建模:从因子到信号的完整流程
android·开发语言·python·算法·kotlin
Zentceh1 小时前
PixelClean 这类 AI 降噪算法是怎么工作的?从 RAW 域到 GAN 色彩重建的技术拆解
图像处理·人工智能·科技·算法·计算机视觉·车载系统·智能硬件
用户0390614707191 小时前
无感观测器理论模型(NTSM-SMO-PLL 与 SMO-PLL)
算法
垆边人似月.1 小时前
找出最小的 K 个数
数据结构·c++·算法