洛谷解题日记||基础篇6(二分和搜索)

【二分查找详细解析】& 【图解】& 例题【洛谷P2249 【深基13.例1】查找】 【二分查找详细解析】& 【图解】& 例题【洛谷P2249 【深基13.例1】查找】&二分的时间复杂度分析 阅读详情

这是一个典型的最小化最大间距的问题,可以使用二分查找来解决。下面是详细的解题思路和步骤:

解题思路

  1. 问题分析:

    • 我们需要在已有路标之间增加新的路标,使得相邻路标之间的最大距离(即“空旷指数”)尽可能小。
    • 给定最多能增加的路标数 K,我们希望找到一种最优的安排,使得相邻路标的最大间距最小。
  2. 二分查找最小的最大间距:

    • 设定一个最大间距的搜索范围 [1,L],其中 L 是公路的总长度。
    • 用二分查找的方法,假设某个间距 mid,检查能否通过增加不超过 K 个路标,使得所有相邻路标之间的间距不超过 mid。
  3. 检查函数的设计:

    • 对于每一对相邻的已有路标,如果它们的距离超过 mid,就需要在这段区间内增加一些路标。
    • 计算在每对相邻路标之间,需要增加的路标数量,以使每个间隔不超过 mid。
    • 如果所需的路标数不超过 K,则当前的 mid 是可行的;否则,mid 太小,需要增大间距。
  4. 二分查找过程:

    • 如果某个 mid 可行(能满足条件),继续尝试更小的间距,看看是否能进一步优化。
    • 如果某个 mid 不可行,增大 mid,直到找到最小的可行间距。
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 判断在最大间距为 maxDist 的情况下,是否能通过增设不超过 K 个路标,使得所有相邻路标的间距不超过 maxDist
bool canAchieveMaxDist(const vector<int>& positions, int K, int maxDist) {
    int addedSigns = 0;  // 记录需要增加的路标数量
    for (size_t i = 1; i < positions.size(); ++i) {
        int dist = positions[i] - positions[i - 1];  // 相邻路标之间的距离
        // 如果相邻路标之间的距离超过 maxDist,需要在这段间隔中增设路标
        if (dist > maxDist) {
            // 计算在当前间隔中需要增加的路标数,确保每段间距不超过 maxDist
            addedSigns += (dist - 1) / maxDist;
        }
        // 如果所需的新增路标数超过了 K,则说明当前的 maxDist 不可行
        if (addedSigns > K) return false;
    }
    return true;  // 如果总的新增路标数不超过 K,说明 maxDist 可行
}

int main() {
    ios::sync_with_stdio(false);  // 提升 IO 效率
    cin.tie(nullptr);  // 解除 cin 和 cout 的绑定

    int L, N, K;
    cin >> L >> N >> K;  // 输入公路总长度 L,已有路标数量 N,和最多可新增的路标数 K
    
    vector<int> positions(N);
    for (int i = 0; i < N; ++i) {
        cin >> positions[i];  // 输入路标的位置,按升序排列
    }

    int left = 1, right = L;  // 二分查找的范围:[1, L]
    int answer = L;  // 初始化答案为 L,即最坏情况下的最大间距

    // 二分查找,寻找最小的可行最大间距
    while (left <= right) {
        int mid = left + (right - left) / 2;  // 取中点,作为尝试的最大间距
        // 检查当前的 mid 值是否可行
        if (canAchieveMaxDist(positions, K, mid)) {
            answer = mid;  // 如果可行,更新答案为当前的最大间距
            right = mid - 1;  // 继续尝试更小的最大间距
        } else {
            left = mid + 1;  // 如果不可行,增大最大间距,尝试更大的 mid
        }
    }

    cout << answer << '\n';  // 输出最小的最大间距
    return 0;
}


#include <bits/stdc++.h>
using namespace std;

const int N = 1000000 + 10;  // 最大树木数量的常量
int a[N], mid, l, r, n, m;  // 定义数组a存储树高,其他变量用于二分查找

// 检查函数:判断给定锯片高度 x 是否能满足获取至少 m 米木材的要求
bool check(int x) {
    int s = 0;  // 用于累加当前锯片高度 x 能获得的木材长度
    for (int i = 1; i <= n; i++) {  // 遍历每棵树
        if (a[i] > x)  // 如果当前树高 a[i] 大于 x,高于部分可以切割
            s += a[i] - x;  // 累加这棵树能切割的木材长度
        if (s >= m)  // 如果累加长度已经达到或超过 m,提前返回 true
            return true;
    }
    return false;  // 遍历所有树后,若未达到 m,返回 false
}

int main() {
    cin >> n >> m;  // 输入树的数量 n 和所需木材长度 m
    for (int i = 1; i <= n; i++)  // 读入每棵树的高度
        cin >> a[i];
    
    l = 0, r = 1e9;  // 设置二分查找的初始范围:锯片高度可以是从 0 到 1e9

    // 二分查找,找到满足至少砍下 m 米木材的最大锯片高度
    while (l <= r) {
        mid = (l + r) / 2;  // 计算当前中间锯片高度
        if (check(mid))  // 如果该高度能满足砍木材的需求
            l = mid + 1;  // 继续尝试更高的锯片高度
        else
            r = mid - 1;  // 否则降低锯片高度
    }

    cout << r << endl;  // 输出最后确定的最大锯片高度
    return 0;
}


这题可以直接用递归,但递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多,在竞赛中如果系统栈很小的话,过深的递归会让栈溢出。解决方法是手工模拟递归中栈的操作,将递归转化为非递归算法。 程序中,p相当于堆栈的指针,指向当前拆分的数的位置。sum为已经拆分出来的数的和,如果和小于N,则继续往下拆分,下一个拆分的数不小于前一个拆分的数;如果和等于N,则输出这一组解;如果和大于N,则返回到上一个数,并把上一个数加1后继续查找下一组解。(大炮打蚊子)

#include <bits/stdc++.h>
using namespace std;

int Num[100]; // 用于存储当前拆分的数字
int n, sum;   // n 是待拆分的数字,sum 是当前拆分的总和

// 输出当前拆分的加法式子
void Print(int k) {
  printf("%d", Num[1]);  // 打印第一个数字
  for (int i = 2; i <= k; i++) // 打印后续的数字,并用 "+" 连接
    printf("+%d", Num[i]);
  printf("\n");  // 换行,输出当前拆分完成
}

int main() {
  cin >> n;  // 输入待拆分的数字 n
  Num[1] = 1;  // 初始化第一个数字为 1
  for (int p = 1; p >= 1;) {  // p 是堆栈的指针,指向当前拆分的位置
    // 如果当前数字的和没有超过 n
    if (sum + Num[p] < n) {
      sum += Num[p];  // 将当前数字加入到和中
      p++;            // 移动到下一个位置
      Num[p] = Num[p - 1];  // 后续数字至少等于前一个数字,保证拆分是递增的
    }
    else {  // 当当前数字的和超过或等于 n
      if (sum + Num[p] == n && p != 1)  // 确保不打印 n = n 的情况
        Print(p);  // 找到一个合法的拆分,输出该拆分
      p--;  // 回退到上一个位置,尝试新的拆分方式
      sum -= Num[p];  // 从当前和中去掉刚刚回退的数字
      Num[p]++;  // 增加当前数字,继续尝试拆分
    }
  }
  return 0;
}

 

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int n, minDifference = INT_MAX; // n 是配料种类数,minDifference 用于记录最小的酸度和苦度差
vector<pair<int, int>> ingredients; // 存储每种配料的酸度和苦度

// 递归函数:枚举所有配料组合,计算酸度和苦度的最小绝对差
void findMinDifference(int index, int sour, int bitter, bool used) {
    if (index == n) { // 终止条件:遍历完所有配料
        if (used) { // 检查是否至少选择了一种配料
            // 更新最小绝对差
            minDifference = min(minDifference, abs(sour - bitter));
        }
        return;
    }

    // 情况1:选择当前配料
    // 更新酸度为 sour * 当前配料的酸度,苦度为 bitter + 当前配料的苦度
    findMinDifference(index + 1, sour * ingredients[index].first, bitter + ingredients[index].second, true);

    // 情况2:不选择当前配料
    // 保持酸度和苦度不变,继续递归
    findMinDifference(index + 1, sour, bitter, used);
}

int main() {
    cin >> n; // 读取配料的种类数
    ingredients.resize(n); // 调整配料数组大小

    // 读取每种配料的酸度和苦度
    for (int i = 0; i < n; i++) {
        cin >> ingredients[i].first >> ingredients[i].second;
    }

    // 从第一个配料开始递归,初始酸度为1,苦度为0,未选择任何配料
    findMinDifference(0, 1, 0, false);

    cout << minDifference << endl; // 输出最小绝对差
    return 0;
}

这是一道递归搜索题,可以通过深度优先搜索(DFS)来求解。具体思路如下:

  1. 数据结构:

    • 使用 vector<string> 存储所有输入的单词。
    • 记录每个单词在构造的“龙”中使用的次数,最多允许使用两次。
  2. 递归搜索:

    • 从以指定开头字母的单词开始构造“龙”,每次递归时寻找下一个可以连接的单词。
    • 判断两个单词是否可以连接:一个单词的末尾部分和另一个单词的开头部分是否匹配。匹配时,允许从第一个单词尾部截取一部分,和第二个单词的开头重合。
  3. 长度计算:

    • 每次递归调用中,将当前“龙”的长度与记录的最长长度进行比较,更新最长长度。
  4. 递归终止:

    • 当遍历完所有可能的连接时,返回到上层递归,继续寻找其他可能的组合。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int n; // 单词数
vector<string> words; // 存储所有单词
vector<int> wordCount; // 记录每个单词的使用次数,确保每个单词最多使用两次
int maxLength = 0; // 最长“龙”的长度

// 检查两个单词能否连接,并返回连接后的长度增量
int canConnect(const string &a, const string &b) {
    int lenA = a.length();
    int lenB = b.length();
    // 从 1 开始遍历,避免完全重合的情况
    for (int i = 1; i < lenA; i++) {
        // 检查 a 的后缀和 b 的前缀是否匹配
        if (a.substr(lenA - i) == b.substr(0, i)) {
            return lenB - i; // 返回 b 中去掉重合部分后的长度
        }
    }
    return 0; // 无法连接时返回 0
}

// 深度优先搜索 (DFS) 函数,用于构造“单词接龙”
void dfs(const string &currentDragon, int currentLength) {
    // 更新当前最长的“龙”的长度
    maxLength = max(maxLength, currentLength);
    // 遍历所有单词,尝试进行连接
    for (int i = 0; i < n; i++) {
        // 确保单词使用次数不超过两次
        if (wordCount[i] < 2) {
            // 检查 currentDragon 和 words[i] 是否可以连接
            int lengthIncrease = canConnect(currentDragon, words[i]);
            if (lengthIncrease > 0) { // 如果可以连接
                wordCount[i]++; // 增加使用次数
                // 递归构造新的接龙,增加接龙长度
                dfs(currentDragon + words[i].substr(words[i].length() - lengthIncrease), 
                    currentLength + lengthIncrease);
                wordCount[i]--; // 回溯,恢复该单词的使用次数
            }
        }
    }
}

int main() {
    cin >> n;
    words.resize(n);
    wordCount.resize(n, 0); // 初始化每个单词的使用次数为 0
    for (int i = 0; i < n; i++) {
        cin >> words[i];
    }
    char startChar;
    cin >> startChar;

    // 寻找以指定字母开头的单词作为起点
    for (int i = 0; i < n; i++) {
        if (words[i][0] == startChar) { // 找到以 startChar 开头的单词
            wordCount[i]++; // 使用该单词
            // 从该单词开始构造“龙”,并进行深度优先搜索
            dfs(words[i], words[i].length());
            wordCount[i]--; // 回溯
        }
    }

    // 输出最长“龙”的长度
    cout << maxLength << endl;
    return 0;
}


这个问题是典型的 N 皇后问题的变体,要求在 n x n 的棋盘上放置 n 个棋子(称作皇后),使得每行、每列和每条对角线至多有一个棋子。我们可以通过递归和回溯来实现解法。

以下是对解决方法的详细解释:

思路

  1. 皇后位置的表示:

    • 用一个长度为 n 的数组 solution 来表示解,其中 solution[i] 表示第 i 行的皇后放置在哪一列。
  2. 约束条件:

    • 每一行只能有一个皇后。
    • 每一列只能有一个皇后。
    • 每条对角线上只能有一个皇后。
  3. 回溯法:

    • 从第一行开始尝试在每一列放置皇后,逐步填充每一行,检查是否符合条件。
    • 如果某一列放置后,满足不在同一列、不在同一对角线,就继续放置下一行的皇后。
    • 如果不满足条件,则回溯,尝试下一列。
  4. 对角线的判断:

    • 对角线的冲突可以通过两个辅助数组 diag1 和 diag2 来检测。
      • diag1[i + j]:表示从左上到右下的对角线,i + j 是该对角线的唯一标识。
      • diag2[i - j + n - 1]:表示从右上到左下的对角线,i - j + n - 1 是该对角线的唯一标识。
  5. 按字典序排列:

    • 按列号递增顺序逐个放置皇后,这样天然符合字典序。
  6. 输出限制:

    • 只需要输出前三个解,之后只需计数。
#include <iostream>
#include <vector>
using namespace std;

int n;                        // 棋盘大小,即 n x n 大小的棋盘
vector<int> solution;         // 当前解,solution[i] 表示第 i 行皇后所在的列
vector<bool> column;          // 标记某一列是否已有皇后
vector<bool> diag1, diag2;    // 标记两条对角线是否已有皇后
int solutionCount = 0;        // 解的总数

// 输出一个完整解,将每行的列号打印
void printSolution() {
    for (int i = 0; i < n; i++) {
        cout << solution[i] + 1; // 将列号转换为从 1 开始
        if (i < n - 1) cout << " ";
    }
    cout << endl;
}

// 递归搜索函数 row 表示当前行
void solve(int row) {
    // 如果 row 等于 n,说明已成功放置 n 个皇后,找到一个解
    if (row == n) {
        solutionCount++; // 解的计数加一
        if (solutionCount <= 3) {
            printSolution(); // 前三个解按题目要求输出
        }
        return;
    }

    // 尝试在当前行的每一列放置皇后
    for (int col = 0; col < n; col++) {
        // 检查当前列和两个对角线是否可以放置皇后
        if (!column[col] && !diag1[row + col] && !diag2[row - col + n - 1]) {
            solution[row] = col; // 放置皇后在第 row 行的第 col 列
            column[col] = diag1[row + col] = diag2[row - col + n - 1] = true;

            solve(row + 1); // 递归处理下一行

            // 回溯:移除皇后并恢复标记
            column[col] = diag1[row + col] = diag2[row - col + n - 1] = false;
        }
    }
}

int main() {
    cin >> n;

    solution.resize(n);                // 初始化解数组大小
    column.assign(n, false);           // 初始化列标记数组为 false,表示未被占用
    diag1.assign(2 * n - 1, false);    // 初始化对角线数组为 false,表示未被占用
    diag2.assign(2 * n - 1, false);    // 初始化反对角线数组为 false

    solve(0); // 从第 0 行开始递归搜索

    cout << solutionCount << endl; // 输出解的总数
    return 0;
}

在 N 皇后问题中,我们需要确保每个皇后不仅不在同一行和同一列上,还要确保它们不在同一条对角线上。为了高效地检查对角线的冲突,diag1 和 diag2 这两个数组被用来标记棋盘上的对角线是否已经有皇后。

具体来说,diag1 和 diag2 用来分别表示两种类型的对角线:

1. diag1(左上到右下的对角线)

  • 表示方向:从左上到右下的对角线(\ 方向)。

  • 数组定义:diag1[row + col]

    • 解释:diag1 数组的索引是 row + col,它代表了左上到右下的每一条对角线。对于一个给定的棋盘位置 (row, col),它所在的对角线的索引为 row + col。
    • 原因:所有位于同一条左上到右下对角线的格子的 row + col 值是相同的。例如,位置 (0, 0)、(1, 1)、(2, 2) 都在同一条对角线上,它们的 row + col 都是 0、2、4 等等。
  • 例子:

    • 对于 (0, 0),diag1[0] 为 true 表示左上到右下对角线上已经有皇后。
    • 对于 (1, 1),diag1[2] 为 true 表示同一条对角线上已经有皇后。
  • 初始化:在开始时,diag1 数组的所有元素都为 false,表示没有皇后占据任何对角线。

洛谷算法竞赛生态全解析:从核心功能到高效学习路径 在线评测系统(OJ)是算法学习和编程竞赛的核心平台,其原理在于通过自动化评测机验证代码的正确性、时间与空间效率。这项技术的价值在于为学习者提供了即时反馈和标准化的训练环境,极大地提升了算法练习的效率与效果。在众多应用场景中,中文算法竞赛社区洛谷构建了一个集题目、评测、社区、教程于一体的完整生态。本文聚焦于洛谷平台,深入剖析其题目系统、评测机制与社区功能等核心模块,并融入题单规划和博客沉淀等实用技巧,旨在帮助用户系统性地提升算法能力,将平台工具价值最大化,从而在算法竞赛与工程实践中建立扎实基础。 阅读详情

相关推荐

使用Eggjs做服务端获取微信小程序云开发数据库的access_token

最近自己想写了一个微信小程序,恰巧里面有个云开发,恰巧里面有个数据库,那懒人的我,就直接用云开发里面的数据库了,做测试或者正式也好,对于刚开始来说,免费的配额是够用的。 后来想到在小程序云开发上面的数据怎么看才方便?刚好微信小程序有一个服务端API,那就方便很多了,那就直接敲个服务端来获取云开发上数据库的数据出来到自己的后台上面,那以后管理起来也方便很多。 看了一下服务端api之后,发现有三个重要...

kalenE992的博客 1705

洛谷-二分算法

二分查找 一般来说,二分查找都是在有序的区间中查找目标值,每次查找去掉不符合条件的一半区间,直到找到答案(整数二分)或者与答案相近的值(浮点二分)。 整数二分模板 //向左查找,比如可以查找第一个大于等于目标的值 while(l < r){ int mid = l + r >> 1; if(check(mid)) r = mid; //check函数是判断mid是否合法,也就是看是否满足条件 else l = mid + 1; } //向右查找..

weixin_54956779的博客 1977

解决MATLAB2020B关于找不到vs2019C++编译器问题

解决MATLAB2020B关于找不到vs2019C++编译器问题

wcm2577的博客 7605

!二分算法学习!(洛谷官方算法题单:二分查找与二分答案)

含不同做法与错因供大家借鉴汲取🌹

2302_79761709的博客 1982

Python爬虫实战:高效爬取华尔街日报文章的技术与代码详解

在当今信息爆炸的时代,金融数据和分析对于投资者、研究人员和企业决策者来说至关重要。华尔街日报(WSJ)作为全球最具影响力的财经媒体之一,其文章内容具有极高的价值。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫,涵盖从基础到高级的各种技术要点。本文详细介绍了如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫。我们从基础爬虫实现开始,逐步添加了高级功能如分布式处理、反反爬虫策略、数据清洗和存储等。异步处理:使用asyncio和httpx实现高性能网络请求。

2201_76125261的博客 385

计算机视觉与深度学习 | Matlab实现ORBSLAM2(附完整代码)

================================================ 博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 ================================================ 代码阅览 效果图 代码 imdsLeft = imageDatastore('C:\MichaelSpace\matlabworks

尘世冰封的专栏 1522

洛谷——《二分查找和二分答案》

【代码】洛谷——《二分查找和二分答案》

weixin_66996038的博客 475

全网首发--Unet3+改进16:在不同位置添加RepLKBlock超大卷积核

本文提出了一种基于大核卷积的神经网络架构RepLKNet,旨在缩小CNN与ViTs之间的性能差距。通过重新审视CNN中的大核设计,研究证明使用少量大卷积核替代多个小核能获得更强大的性能。提出的RepLKNet采用31×31大卷积核,在ImageNet和下游任务上取得了与SwinTransformer相当或更好的结果,同时具有更低延迟。文章详细介绍了实现步骤:(1)创建RepLKBlock模块文件;(2)在模型层中添加注意力机制;(3)在UNet模型中集成RepLKBlock;(4)完成训练流程。该方法展现了

AIcurator的博客 614

算法基础(二分查找)

输入n个不超过109的单调不减的(就是后面的数字不小于前面的数字)非负整数a1​a2​an​,然后进行m次询问。对于每次询问,给出一个整数q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出−1。

l_9cfac4a9的博客 1757

华为MetaERP Oracle EBS OM(订单管理)模块详解作为ERP财务解决方案架构师,理解OM模块的业务全景和数据模型至关重要。OM是EBS分销链路的核心引擎,贯穿“订单到收款“(Orde

Oracle EBS OM模块是管理销售订单全生命周期的核心模块,涵盖客户管理、订单执行、发运开票、定价及信用控制等功能。其标准流程包括订单录入、预订、发放、发运确认和自动开票等环节,核心数据表涉及订单、客户、发运和定价等业务对象。OM模块与库存、应收、发运等模块深度集成,架构师需重点设计订单类型、信用控制策略和自动开票接口等关键环节,确保业务流程高效流转。

金牌架构师 357

使用Simulink进行无刷电机霍尔传感器信号处理电路的仿真

位置检测:霍尔传感器可以检测转子的位置,这对于实现无刷电机的电子换向至关重要。提高效率:通过准确的位置信息,可以优化电机的工作状态,提高效率和性能。通过上述步骤,我们简要介绍了如何基于Simulink实现无刷电机霍尔传感器信号处理电路的仿真。

MHD0815的博客 430

洛谷解题日记||基础篇3

遍历区间,寻找零点[−100,100][i,i+1][i,i+1]f(l)f(r)判断区间内是否有根,使用二分法逼近:如果区间端点的符号相反,即f(l)和f(r)的乘积小于0,说明区间内有根。根据,如果一个连续函数在区间的两端有不同的符号,那么区间内必定存在一个根。:使用二分法缩小区间,直到区间的宽度小于 0.001。这里0.001是控制精度的阈值。:计算区间的中点m。:检查中点和右端点的函数值符号,如果符号相反,根在左半区间,将左端点更新为中点l = m;

ke_wu的博客 1162

DeepSeek 赋能招投标全流程智能化:多模态解析、知识图谱与投标文件自动生成实战指南(附完整代码与行业案例)

摘要:本文深入探讨DeepSeek技术在招投标领域的全流程智能化应用,通过整合自然语言处理(NLP)、多模态解析、知识图谱等核心技术,实现招标文件智能解析与投标文件自动生成。文中详细解析DeepSeek-R1模型的多模态处理机制、动态知识图谱构建方法及智能模板填充算法,通过完整代码实现展示技术细节。结合广某资源交易平台、山西XX"XX云"等典型案例,验证技术方案在提升招投标效率、降低人为错误方面的显著效果。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1462

洛谷解题日记||基础篇4

这是一个典型的“背包问题”的变种,其中我们有10个配料,每个配料的质量只能是 1、2 或 3,总和要等于给定的美味程度 nnn。我们需要找出所有可能的组合,并且按字典序输出这些组合。这样每次迭代都可以将可能的最大和范围缩小,最终找到符合要求的最小可能值。从数列的最大值开始,因为单段的和不能小于任何一个单独元素。从数列的总和开始,因为将所有元素放在一段内,其和就是总和。:从左到右遍历数列,将元素累加到当前段,直到段和超出。时重新开始一段,计数段数。使用回溯算法来生成所有合法的组合。

ke_wu的博客 695

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

洛谷刷题日记||基础篇10线性表&&二叉树

在代码中,使用是为了将i 和j 唯一地组合成一个键值,存储到map中,以下是详细原因和原理:或者也可以用pair代替数组,更容易操作和方便理解,但复杂度也随之上升使用std::pair改写代码,可以更直接表达(i, j)的组合关系,同时让代码更清晰。

ke_wu的博客 639

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

洛谷刷题日记12||图的遍历

可以将每个杂务视为一个节点,准备工作视为有向边,然后通过拓扑排序确定每个节点的完成顺序,最后使用动态规划求出完成所有工作的最短时间。这样可以方便地从每个奶牛所在的牧场出发,找到所有可以到达的节点。:对于每头奶牛所在的牧场,利用 BFS 或 DFS 遍历所有可到达的节点,同时记录每个节点被多少头奶牛访问过。:如果某个节点被所有奶牛访问过(即计数等于奶牛数量 K),则该节点为可行的聚集地点。按题目来每次考虑每个点可以到达点编号最大的点,不如考虑较大的点可以反向到达哪些点。(任务 1 自身时间)

ke_wu的博客 1321

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

洛谷试炼日记(manacher和trie树)(解题报告)

文章目录**manacher**P4555 [国家集训队]最长双回文串P1659 [国家集训队]拉拉队排练**Trie字典树**P3879 [TJOI2010]阅读理解P2292 [HNOI2004]L语言P2922 [USACO08DEC]Secret Message GP3065 [USACO12DEC]First! G manacher P4555 [国家集训队]最长双回文串 题目链接 思路:最开始只有一个n^2的思路,不用写都知道会T 看了大佬的思路之后恍然大悟 在求以位置i为中心的最大回文串长度时

juruo_c的博客 301

洛谷比赛日记

好不容易参个赛才做几个小时 http://www.luogu.org/contest/show?tid=624 只做了前4题,后面5题直接空着其实只是刷刷水题 工厂,模拟题 一开始zz想了半天怎么贪心,差点去写搜索,最后突然发现只能按序放…… 秒之(一开始没注意规模wa了,改了long long就a了) ——不知道为什么有人T掉,无法理解 1 #inclu...

weixin_30588729的博客 103

洛谷P2089 烤鸡 (小弱鸡的翻车日记)

搜素思路:以三种添加方式为横向,十种调料为纵向,第一种添加完就添加下一种,如果达到10种并且等于美味值就记录下来,否则回溯,即为换一种添加方式,直到for循环里所有的情况都尝试完,返回上一层递归继续for循环尝试。本题测试n最大为5000,其实可以使用暴力枚举的方法,就是写十层for循环嵌套,每次判断和是不是等于美味值。每次回溯,要把那个在数组中的元素抹去(设置为0),并且在sum中减去。//本题难点,先输出种类数目,要把各种情况存起来按一定顺序输出。//容器固然好用,但是输出 格式是个问题。

Jerryle__的博客 354

洛谷B3636

洛谷,菜菜奋斗日记,C++

2402_88149600的博客 399

NOIP前做题日记

FLAG : 三天把洛咕任务计划里咕掉的题目搞定! 主要在洛谷刷题qwq 10.22 P1363 搜索 10.23 P3952 恶心的模拟 P2375 KMP 10.24 P4933 DP AGC009D 点分治 10.25 CF946G LIS DP 10.26 P4932 数学 CF787D 线段树+最短路 10.27 P1351 思路 明天早上计划搞几道毒瘤数据结构题搞几一道DP 真香 本来...

weixin_30530939的博客 221

刷题日记day1(搜索)

第一篇题解目录第一篇题解目录。

2502_91702733的博客 1173

【ACM】—蓝桥杯大一暑期集训Day1

ACM大一暑期集训Day1练习题

H1727548的博客 4173

求细胞数量(洛谷P1451,C语言,BFS)

一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

qq_65265649的博客 941

2023CYEZOI 线下比赛日记1

Day1 - Day 6

m0_73430577的博客 440

【ACM】—蓝桥杯大一暑期集训Day4

ACM大一暑期集训Day4练习题

H1727548的博客 1980
上一篇: 洛谷刷题日记||基础篇5(贪心)
下一篇: 牛客挑战赛77
手冲咖啡大师
博客等级 码龄5年 632粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值