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

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

第一题 【深基7.例11】评等级


题目描述


现有 N 名同学,每名同学需要设计一个结构体记录以下信息:学号、学业成绩和素质拓展成绩、综合分数(实数)。每行读入同学的姓名、学业成绩和素质拓展成绩,并且计算综合分数(分别按照 70 %和 30 % 权重累加),存入结构体中。还需要在结构体中定义一个成员函数,返回该结构体对象的学业成绩和素质拓展成绩的总分。


然后需要设计一个函数,其参数是一个学生结构体对象,判断该学生是否“优秀”。优秀的定义是学业和素质拓展成绩总分大于 140  分,且综合分数不小于 80 分。


当然通过本题很容易啦,本题只是为了帮助你训练结构体的使用方法。


输入格式


第一行一个整数 N 。


接下来 N 行,每行 3 个整数,依次代表学号、学业成绩和素质拓展成绩。


输出格式


N行,如果第 i名学生是优秀的,输出 Excellent,否则输出 Not excellent。


样例 #1


样例输入 #1

4
1223 95 59
1224 50 7
1473 32 45
1556 86 99


样例输出 #1

Excellent
Not excellent
Not excellent
Excellent


提示


数据保证,1 ≤ N ≤ 1000,学号为不超过 100000的正整数,学业成绩和素质拓展成绩为 0 ∼ 100之间的正整数。


解题思路


1)用结构体储存学生信息。

2)按照题目条件判断是否优秀,进行输出。


参考代码


#include<bits/stdc++.h>
using namespace std;
struct node{
    int id;
    double sc1, sc2;
    int score;
    double final_score;
}a[1000];
int main() 
{
    int n;
    cin >> n;
    for(int i=0; i<n; i++)
    {
        cin>>a[i].id>>a[i].sc1>>a[i].sc2;
        a[i].score=a[i].sc1+a[i].sc2;
        a[i].final_score=a[i].sc1*0.7+a[i].sc2*0.3;
    }
    for(int i=0; i<n; i++)
    {
        if(a[i].score>140&&a[i].final_score>=80) 
        {
            cout <<"Excellent"<<endl;
        }
        else 
        {
            cout<<"Not excellent"<<endl;
        }
    }
    return 0;
}


第二题 5 倍经验日


题目背景


现在乐斗有活动了!每打一个人可以获得 5 倍经验!absi2011 却无奈的看着那一些比他等级高的好友,想着能否把他们干掉。干掉能拿不少经验的。


题目描述


现在 absi2011 拿出了 x个迷你装药物(嗑药打人可耻…),准备开始与那些人打了。


由于迷你装药物每个只能用一次,所以 absi2011 要谨慎的使用这些药。悲剧的是,用药量没达到最少打败该人所需的属性药药量,则打这个人必输。例如他用 2 个药去打别人,别人却表明 3 个药才能打过,那么相当于你输了并且这两个属性药浪费了。


现在有 n 个好友,给定失败时可获得的经验、胜利时可获得的经验,打败他至少需要的药量。


要求求出最大经验 s ,输出 5 s。


输入格式


第一行两个数,n 和 x。


后面 n行每行三个数,分别表示失败时获得的经验 l o s e,胜利时获得的经验wini和打过要至少使用的药数量 u s e i。


输出格式


一个整数,最多获得的经验的五倍。


样例 #1


样例输入 #1

6 8
21 52 1
21 70 5
21 48 2
14 38 3
14 36 1
14 36 2


样例输出 #1

1060


提示

【Hint】


五倍经验活动的时候,absi2011 总是吃体力药水而不是这种属性药。


【数据范围】


image.png


解题思路


1)变形的01背包问题。

2)分两种情况,第一种是能打过,可以选择打或不打,第二种是打不过。


参考代码


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


第三题 最大约数和


题目描述


选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。


输入格式


输入一个正整数S。


输出格式


输出最大的约数之和。


样例 #1


样例输入 #1

11


样例输出 #1

9


提示


样例说明


取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。


数据规模

S<=1000


解题思路


1)看起来像数学题,其实还是背包问题。

2)先进行预处理,求每个数最大公约数的和。

3)01背包解决问题。


参考代码


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


第四题 【深基16.例3】二叉树深度


题目描述


有一个 n ( n ≤ image.png ) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 n),建立一棵二叉树(根节点的编号为 1),如果是叶子结点,则输入 0 。


建好树这棵二叉树之后,请求出它的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。


输入格式


第一行一个整数 n ,表示结点数。


之后 n行,第 i 行两个整数 l、r ,分别表示结点 i的左右子结点编号。若 l = 0  则表示无左子结点,r = 0  同理。


输出格式


一个整数,表示最大结点深度。


样例 #1


样例输入 #1

7
2 7
3 6
4 5
0 0
0 0
0 0
0 0


样例输出 #1

4


解题思路


1)建立二叉树结点,输入结点信息。

2)深度优先搜索遍历出二叉树深度。


参考代码


#include<bits/stdc++.h>
using namespace std;
struct node{
  int l,r;
}a[1001000];
int Max=-1,n;
void dfs(int root,int step){
  if(root==0) return;
  Max=max(Max,step);
  dfs(a[root].l,step+1);
  dfs(a[root].r,step+1);
}
int main(){
  cin>>n;
  for(int i=1;i<=n;i++){
    cin>>a[i].l>>a[i].r;
  }
  dfs(1,1); 
  cout<<Max;
  return 0;
}



相关文章
|
1月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
64 15
|
1月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
10天前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
30 4
|
2月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
39 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
3月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
114 2
|
2月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3天前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
33 12
|
1月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
48 16
|
1月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
1月前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。

热门文章

最新文章