当前位置: 首页 > ai >正文

梦熊解析:202505基础算法

T1 - 最小数码

解法:
第一问答案为 2n,因为从 n 变成 2n 的过程中,若进位会使数码和减少(逢十进一),因此不进位时数码和最大。不进位的充要条件是每一位权值在 4 以内。
第二问需找到每一位均为 4 或更小,且数码和为 n 的最小值。为使位数最少,贪心策略是尽可能多填 4,小数放前。
示例:

  • 若 n=5,答案为 14
  • 若 n=8,答案为 44

Code:

#include <bits/stdc++.h>

using namespace std;

#define sc(x) scanf("%d", &x)

vector<int> v;

int main() {

    int n;

    sc(n);

    cout << 2 * n << endl;

    while (n != 0) {

        if (n >= 4) v.push_back(4), n -= 4;

        else v.push_back(n), n = 0;

    }

    for (int i = v.size() - 1; i >= 0; i--)

        printf("%d", v[i]);

return 0;

}

T2 - 数

解法:
枚举 b 的大小(上界为 log2n),确定 b 后,a=⌊2bnc=na⋅2b,取 a+b+c 的最小值。复杂度为 O(logn)

Code:

#include <bits/stdc++.h>

using namespace std;

#define ll long long

int main() {

    ll n;

    cin >> n;

    ll B = log2(n);

    ll ans = n;

    for (int b = 1; b <= B; b++) {

        ll t = pow(2ll, b);

        ll a = n / t;

        ll c = n - a * t;

        ans = min(ans, a + b + c);

    }

    cout << ans;

return 0;

}

T3 - 相等

解法:
令 d=ba,问题等价于通过 k 轮操作(每轮可将当前数加 k 或 k+1)使 a 变为 b

  • 若 a 和 b 奇偶性不同,无解。
  • 否则,通过二分或暴力枚举找到最小 k,满足 k(k+1)/2≥d 且 (dk(k+1)/2) 为偶数。

Code:cpp

#include <bits/stdc++.h>

using namespace std;

#define int long long

signed main() {

    int t;

    cin >> t;

    while (t--) {

        int a, b;

        cin >> a >> b;

        if (a > b) swap(a, b);

        int ans = 0;

        while (a < b || (b - a) % 2) {

            ans++;

            a += ans; // 每轮默认选k(加ans)

        }

        cout << ans << endl;

    }

return 0;

}

T4 - 一和二

解法:
将 1 视为 −12 视为 1,问题转化为寻找跨过中间间隙的区间,使剩余部分和为 0

  • 预处理前缀和,左半部分(前 n 项)和右半部分(后 n 项)分别计算。
  • 利用哈希表存储右半部分前缀和,枚举左半部分前缀和,查找是否存在互补值,计算最小区间长度。

Code:

#include <bits/stdc++.h>

using namespace std;

const int maxn = 2e5 + 84;

int T, n, a[maxn], ans;

map<int, int> mp; // 存储右半部分前缀和对应的位置

int main() {

    scanf("%d", &T);

    while (T--) {

        scanf("%d", &n);

        mp.clear();

        for (int i = 1; i <= n * 2; i++) {

            scanf("%d", &a[i]);

            a[i] = (a[i] == 1 ? -1 : 1); // 1→-1,2→1

        }

        ans = n * 2; // 初始化为最大可能长度

        

        // 计算左半部分前缀和(前n项)

        for (int i = 1; i <= n; i++) {

            a[i] += a[i-1];

            if (a[i] == 0) ans = min(ans, 2*n - i); // 左半部分和为0,剩余右半部分长度

        }

        

        // 计算右半部分前缀和(后n项,逆序处理)

        a[2*n+1] = 0; // 右半部分起点为n+1,终点为2n

        for (int i = 2*n; i >= n+1; i--) {

            a[i] += a[i+1];

            mp[a[i]] = i - (n+1); // 记录前缀和对应的位置偏移(相对于右半部分起点)

            if (a[i] == 0) ans = min(ans, i - 1); // 右半部分和为0,剩余左半部分长度

        }

        

        // 枚举左半部分前缀和,查找右半部分是否有互补值

        for (int i = n; i >= 1; i--) {

            if (mp.find(-a[i]) != mp.end()) {

                // 计算总长度:左半部分剩余i项,右半部分剩余mp[-a[i]]项

                ans = min(ans, mp[-a[i]] + (n - i));

            }

        }

        printf("%d\n", ans);

    }

return 0;

}

http://www.xdnf.cn/news/6697.html

相关文章:

  • debugfs:Linux 内核调试的利器
  • 如何有效的开展接口自动化测试?
  • 今日行情明日机会——20250516
  • PMP-第十二章 项目采购管理
  • windows平台监控目录、子目录下的文件变化
  • 革新直流计量!安科瑞DJSF1352-D电表:360A免分流直连,精度与空间双突破
  • Linux远程连接服务
  • 1基·2台·3空间·6主体——蓝象智联解码可信数据空间的“数智密码”
  • 5 Celery多节点部署
  • c++,linux,多线程编程详细介绍
  • FC7300 ADC采样理论介绍
  • 宽河道流量监测——阵列雷达波测流系统如何监测河道流量
  • GTS-400 系列运动控制器板卡介绍(三十六)--- 电机到位检测功能
  • Ubuntu 22.04 上安装 Drupal 10并配置 Nginx, mysql 和 php
  • Java 多线程基础:Thread 类核心用法详解
  • E-R图合并时的三种冲突
  • SDT-5土体动力特性测试系统
  • 工具生态构建对比分析
  • 进阶-数据结构部分:1、数据结构入门
  • ASP.NET/IIS New StreamContent(context.Request.InputStream) 不会立即复制整个请求流的内容到内存
  • 什么是本地事务,什么是分布式事务
  • 【MATLAB例程】线性卡尔曼滤波的程序,三维状态量和观测量,较为简单,可用于理解多维KF,附代码下载链接
  • ESP32开发之freeRTOS的任务通知
  • OpenCV CUDA模块中矩阵操作------归一化与变换操作
  • window nvidia-smi命令 Failed to initialize NVML: Unknown Error
  • 【学习笔记】因果推理导论第1课
  • 3D一览通为山东融科MES系统补全车间看图能力
  • 车道线检测----CLRNet
  • Elasticsearch倒排索引核心原理面试题
  • 视频孪生智慧风电场解决方案