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

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

第一题 【深基9.例1】选举学生会


题目描述


学校正在选举学生会成员,有 n ( n ≤ 999 ) 名候选人,每名候选人编号分别从 1 到 n,现在收集到了 m ( m < = 2000000 ) 张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。


输入格式


输入 n和 m 以及 m个选票上的数字。


输出格式


求出排序后的选票编号。


样例 #1


样例输入 #1

5 10
2 5 2 2 5 2 2 2 1 2


样例输出 #1

1 2 2 2 2 2 2 2 5 5


解题思路


1)sort 进行排序。

2)进行输出。


参考代码


#include<bits/stdc++.h>
using namespace std;
int a[1000050];
int main()
{
    int n,m;
  cin>>n>>m;
  for(int i=0;i<m;i++) cin>>a[i];
  sort(a,a+m);
  for(int i=0;i<m;i++) cout<<a[i]<<" ";
  return 0;
}


第二题 [NOIP2001 普及组] 装箱问题


题目描述


有一个箱子容量为 V ,同时有 n 个物品,每个物品有一个体积。


现在从 n个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最小值。


输入格式


第一行共一个整数 V,表示箱子容量。


第二行共一个整数 n,表示物品总数。


接下来 n行,每行有一个正整数,表示第 i个物品的体积。


输出格式


共一行一个整数,表示箱子最小剩余空间。


样例 #1


样例输入 #1

24
6
8
3
12
7
9
7


样例输出 #1

0


提示


对于 100 % 数据,满足 0 < n ≤ 30,1 ≤ V ≤ 20000 。


解题思路


1)01背包问题。


参考代码


#include<bits/stdc++.h>
using namespace std;
int dp[105000];
int main()
{
  int v,n;
  cin>>v>>n;
  for(int i=1;i<=n;i++)
  {
    int V;
    cin>>V;
    for(int j=v;j>=V;j--)
    {
      dp[j]=max(dp[j],dp[j-V]+V);
    }
  }
  cout<<v-dp[v];
    return 0;
}


第三题 离开中山路


题目背景


《爱与愁的故事第三弹·shopping》最终章。


题目描述

爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在x1,y1处,车站在x2,y2处。现在给出一个n×n(n<=1000)的地图,0表示马路,1表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(a[i][j]距离为1)。你能帮他解决吗?


输入格式


第1行:一个数 n


第2行~第n+1行:整个地图描述(0表示马路,1表示店铺,注意两个数之间没有空格)


第n+2行:四个数 x1,y1,x2,y2


输出格式


只有1行:最短到达目的地距离


样例 #1


样例输入 #1

3
001
101
100
1 1 3 3


样例输出 #1

4


提示


20%数据:n<=100


100%数据:n<=1000


解题思路


1)题目问的是最短到达目的地距离,这里就能看出应该用广度优先搜索。

2)用结构体存储位置和步数,使用STL模板库中的。将起点入队。

3)循环取队头元素,队头位置能到达的点都依次入队并标记为以访问。

4)到达重终点退出循环输出答案。


参考代码


#include<bits/stdc++.h>
using namespace std;
struct xy{
  int x,y,step;
}now,top;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,m,x,y,xx,yy;
int vis[10001][10001];
char a[10001][10001];
int step=0;
void bfs(int x,int y,int step)
{
  queue<xy> Q;
  top.x=x;
  top.y=y;
  top.step=step;
  Q.push(top);
  vis[x][y]=1;
  while(!Q.empty())
  {
    now=Q.front();
    Q.pop();
    for(int i=0;i<4;i++)
    {
      int nx=now.x+dx[i];
      int ny=now.y+dy[i];
      if(nx<=0||ny<=0||ny>n||nx>n)continue;
      if(vis[nx][ny]==1||a[nx][ny]=='1')continue;     
      top.x=nx;
      top.y=ny;
      top.step=now.step+1;
      vis[nx][ny]=1;
      if(top.x==xx&&top.y==yy)
      {
        cout<<top.step;
        return ;
      }
      Q.push(top);
    }
  }
}
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=n;j++)
    {
      cin>>a[i][j];
    }
  }
  cin>>x>>y>>xx>>yy;
  bfs(x,y,0);
  return 0;
}


第四题 入门


题目描述


不是任何人都可以进入桃花岛的,黄药师最讨厌象郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻的四块瓷砖中的任何一个上,但它也必须是安全的才行。


由于你是黄蓉的朋友,她事先告诉你哪些砖是安全的、哪些砖是不安全的,并且她会指引你飞到第一块砖上(第一块砖可能在任意安全位置),现在她告诉你进入桃花岛的秘密就是:如果你能走过最多的瓷砖并且没有死,那么桃花岛的大门就会自动打开了,你就可以从当前位置直接飞进大门了。


注意:瓷砖可以重复走过,但不能重复计数。


输入格式


第一行两个正整数 W和 H分别表示小路的宽度和长度。


以下 H 行为一个 H × W  的字符矩阵。每一个字符代表一块瓷砖。其中,. 代表安全的砖,# 代表不安全的砖,@ 代表第一块砖。


输出格式


输出一行,只包括一个数,即你从第一块砖开始所能安全走过的最多的砖块个数(包括第一块砖)。


样例 #1


样例输入 #1

11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........


样例输出 #1

59


提示


数据规模与约定

对于全部的测试点,保证 1 ≤ W , H ≤ 20 。


解题思路


1)深度优先搜索,需要注意的是第一步自己脚下的也要算。


参考代码


#include <bits/stdc++.h>
using namespace std;
int sx , sy , ans = 1, n , m; 
char st;
int a[50][50] = {0}; 
int dx[4] = {0 , 1 , 0 , -1} , dy[4] = {1 , 0 , -1 , 0}; 
void dfs(int x , int y){
  for(int v = 0; v < 4; v++)
  { 
    int xx = x + dx[v] , yy = y + dy[v]; 
    if(a[xx][yy] == 0 && xx <= n && xx >= 1 && yy <= m && yy >= 1){ //既能走,又不越界 
      a[xx][yy] = -1; 
      ans++; 
      dfs(xx , yy); 
    }
  }
}
int main()
{
  cin >> m >> n;
  for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
    {
      cin >> st;
      if(st == '.') a[i][j] = 0;
      if(st == '#') a[i][j] = -1;
      if(st == '@')
      {
        sx = i;
        sy = j;
      }
    }
  a[sx][sy] = -1; 
  dfs(sx , sy);
  cout << ans;
  return 0;
} 

目录
打赏
0
0
0
0
7
分享
相关文章
Windows共享文件:探秘C++实现的B树索引算法奇境
在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
76 15
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
19天前
|
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
40 4
|
29天前
|
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
43 8
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
42 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
46 12
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
53 16