【c++百日刷题计划】 ———— DAY10,奋战百天,带你熟练掌握基本算法

简介: 【c++百日刷题计划】 ———— DAY10,奋战百天,带你熟练掌握基本算法


第一题【深基7.习8】猴子吃桃


题目描述


一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n天早上起来一看,只剩下 1个桃子了。请问小猴买了几个桃子?


输入格式


输入一个正整数 n ,表示天数。


输出格式


输出小猴买了多少个桃子。


样例 #1


样例输入 #1

4


样例输出 #1

22


提示


数据保证,1 ≤ n ≤ 20 。


解题思路


1)直接模拟,题目说什么就做什么。


参考代码


#include<iostream>
using namespace std;
int main()
{
    int n,ans=1;
  cin>>n;
  for(int i=1;i<n;i++)
  {
    ans+=1;
    ans*=2;
  }
  cout<<ans<<endl;
  return 0;
}


第二题【深基9.例4】求第 k 小的数


题目描述


输入 n(1 ≤ n < 5000000 且 n 为奇数)个数字 a i (1 ≤ a i <image.png  ),输出这些数字的第 k 小的数。最小的数是第 0小。


请尽量不要使用 nth_element 来写本题,因为本题的重点在于练习分治算法。


输入格式


输出格式


样例 #1


样例输入 #1

5 1
4 3 2 1 5


样例输出 #1

2


解题思路


1)在 STL 里有 nth_element 函数,这个函数主要用来将数组元素中第 k 小的整数排出来并在数组中就位。


参考代码


#include<bits/stdc++.h>
using namespace std;
long long n,k,a[5000010];
int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++)
        cin>>a[i];
    nth_element(a,a+k,a+n);
    cout<<a[k];
}


第三题【模板】快速排序


题目描述


利用快速排序算法将读入的 N个数从小到大排序后输出。


快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)


输入格式


第 1 行为一个正整数 N,第 2 行包含 N  个空格隔开的正整数 a i ,为你需要进行排序的数,数据保证了 A i  不超过image.png


输出格式


将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。


样例 #1


样例输入 #1

5
4 2 4 5 1


样例输出 #1

1 2 4 4 5


提示


对于 20 % 的数据,有 N ≤ image.png

对于 100 % 的数据,有 N ≤ image.png


参考代码


#include <bits/stdc++.h>
using namespace std;
int n,a[1000001];
void qsort(int l,int r)
{
    int mid=a[(l+r)/2];
    int i=l,j=r;
    do{
        while(a[i]<mid) i++;
        while(a[j]>mid) j--;
        if(i<=j)
        {
            swap(a[i],a[j]);
            i++;
            j--;
        }
    }while(i<=j);
    if(l<j) qsort(l,j);
    if(i<r) qsort(i,r);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    qsort(1,n);
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
}


第四题 排序


题目描述


一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列 A , B , C , D 表示A < B , B < C , C < D。在这道题中,我们将给你一系列形如 A < B 的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序。


输入格式


第一行有两个正整数 n , m,n表示需要排序的元素数量,2 ≤ n ≤ 26 ,第 1 到 n 个元素将用大写的 A , B , C , D … 表示。m表示将给出的形如 A < B 的关系的数量。


接下来有 m 行,每行有 3 个字符,分别为一个大写字母,一个 < 符号,一个大写字母,表示两个元素之间的关系。


输出格式


若根据前 x个关系即可确定这 n个元素的顺序 yyy..y(如 ABC),输出


Sorted sequence determined after xxx relations: yyy...y.


若根据前 x个关系即发现存在矛盾(如 A < B , B < C , C < A ),输出


Inconsistency found after x relations.


若根据这 m个关系无法确定这 n个元素的顺序,输出


Sorted sequence cannot be determined.


(提示:确定 n个元素的顺序后即可结束程序,可以不用考虑确定顺序之后出现矛盾的情况)


样例 #1


样例输入 #1

4 6
A<B
A<C
B<C
C<D
B<D
A<B


样例输出 #1

Sorted sequence determined after 4 relations: ABCD.


样例 #2


样例输入 #2

3 2
A<B
B<A


样例输出 #2

Inconsistency found after 2 relations.


样例 #3


样例输入 #3

26 1
A<Z


样例输出 #3

Sorted sequence cannot be determined.


提示


2 ≤ n ≤ 26 , 1 ≤ m ≤ 600 。


解题思路


1)拓扑排序

2)我们将每个字母转化为一个点,只需要考虑整个图拓扑排序的情况。

3)建立栈,将入度为 0 的点入栈。

4)将栈首能到达的点的入度减一。

5)当栈不为空时,进行退栈,并将入度为 0 的点入栈。


参考代码


#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> e[30];
int degree[30];
int a[30];
stack<int> s;
bool vis[30];
int mrk;
bool topo(int r) {
  int sz = 0;
  bool finished = true;
  int t[30];
  for(int i = 0; i < n; i++) {
    t[i] = degree[i];
    if(!degree[i]) s.push(i), vis[i] = true;
  }
  while(!s.empty()) {
    if(s.size() > 1) finished = false;
    int k = s.top();
    a[sz++] = k; 
    s.pop();
    for(int i = 0; i < e[k].size(); i++) t[e[k][i]]--;
    for(int i = 0; i < n; i++) if(!t[i] && !vis[i]) s.push(i), vis[i] = true;;
  }
  if(sz < n) return false;
  if(finished && !mrk) mrk = r;
  return true;
}
int main() {
  cin>>n>>m;
  for(int i = 1; i <= m; i++) 
  {
    char c[3];
    scanf("%s", c);
    int x = c[0] - 'A', y = c[2] - 'A';
    e[x].push_back(y);
    degree[y]++;
    if(!topo(i)) {
      cout<<"Inconsistency found after "<<i<<" relations.";
      return 0;
    }
    memset(vis, false, sizeof(vis));
  }
  if(mrk) {
    cout<<"Sorted sequence determined after "<<mrk<<" relations: ";
    for(int i = 0; i < n; i++) cout<<char(a[i] + 'A');
    cout<<".";
  }
  else cout<<"Sorted sequence cannot be determined.";
  return 0;
}


相关文章
|
8月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
193 2
|
8月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
213 17
|
7月前
|
存储 机器学习/深度学习 算法
基于 C++ 的局域网访问控制列表(ACL)实现及局域网限制上网软件算法研究
本文探讨局域网限制上网软件中访问控制列表(ACL)的应用,分析其通过规则匹配管理网络资源访问的核心机制。基于C++实现ACL算法原型,展示其灵活性与安全性。文中强调ACL在企业与教育场景下的重要作用,并提出性能优化及结合机器学习等未来研究方向。
197 4
|
6月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
185 0
|
7月前
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
225 0
|
3月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
370 0
|
3月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
244 2
|
4月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
254 3
|
3月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
199 8
|
3月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
214 8