深入浅出程序设计竞赛(基础篇)第一章

本章知识点

深入浅出程序设计竞赛-第一章.png

例1-1:你好洛谷

题目描述

输入下面的程序,编译运行。

题解

#include<iostream>
using namespace std;

int main(){
    cout << "Hello LuoGu!";
    return 0;
}

代码解读:

  • #include为头文件,用于引入库,iostream头文件是用来输入和输出的工具。

  • using namespace std,声明命名空间

  • int main()是主函数,

  • cout为C++总的输出语句

  • return 0表示主函数需要返回一个“0”,说明程序正常运行结束。

例1-2:解决算法问题的步骤

题目描述

有10个苹果,小A拿走了2个,Uim拿走了4个,八尾勇拿走了剩下的苹果,想知道:

1、小A 和 Uim两个人一共拿走了多少苹果?

2、八尾勇能拿走多少苹果?

题解

解题思路:小A和Uim共拿走了4+2=6个苹果,剩下的苹果就是八尾勇所拿走的,即10-6=4个苹果,直接输出答案即可。

代码如下:

#include<iostream>
using namespace std;

int main(){
    cout << 2 + 4 << " " << 10 -2 -4;
    return 0;
}

例1-3:分苹果

题目描述

分苹果。现在有14个苹果,要均分给4名同学,分不掉的苹果放回冰箱。请问:

1)每位同学能分得几个苹果?

2)一共分出去多少苹果?

3)把几个苹果放回冰箱?

题解

解题思路:题目提到了均分苹果,共有4名同学,因此每个同学可以分得14/4=3个苹果,共分出去14/4*4=12个苹果,剩下14%4=2个苹果放回了冰箱,直接将值输出即可。

代码如下:

#include<iostream>
using namespace std;

int main(){
    cout << 14 / 4 << endl;
    cout << 14 / 4 * 4 << endl;
    cout << 14 % 4 << endl;
    return 0;
}

例1-4:均分肥仔水

题目描述

均分肥仔水。现有500毫升的肥宅快乐水,要均分给3位同学,每位同学可以分到多少毫升?请输出一个数字作为答案

题解

解题思路:将500毫升均分到3人手上,因此为了避免浪费,需要将500转换为浮点数进行运算,因此每个人可以分到500.0/3=166.667毫升,输出即可。

代码实现:

#include<iostream>
using namespace std;

int main(){
    cout << 500.0 / 3 << endl;
    return 0;
}

例1-5:输出浮点数与精度误差

题目描述

输入以下程序,观察输出。

#include<iostream>
using namespace std;

int main(){
    cout << 500.0 / 3 << endl;
    cout << 5000000.0 / 3 << endl;
    cout << 0.000005 / 3 << endl;
    cout << 5e6 / 3 + 5e-6 / 3 - 5e6 / 3 << endl;
    return 0;
}

题解

将上述程序编译,输出结果如下:

166.667
1.66667e+06
1.66667e-06
1.6666e-06

使用cout输出浮点数,默认保留不超过6位有效位,因此500.0/3输出166.667,如果输出数值太或太小会采用科学计数法进行表示,例如5000000/3正常输出应该为16666666.66,通过科学计数法表示为1.66667e+06,如果是正数,+可以省略,第四个输出1.6666e-06的原因是有效位的浮点数超过了限制,因此有效数字的最右端就会被舍去。

例1-6:火车问题

题目描述

火车问题。甲列车长260m,每秒前进12m;乙列车长220m,每秒前进20m,两车相向而行,从两车车头相遇开始计时,多长时间两车车位相离?已知答案是正数。

题解

解题思路:以甲车为参考系,甲车是静止的,乙相对甲车走了220+260=480m,相对速度为20+12=32m,所需时间为480/32=15s。

代码如下:

#include<iostream>
using namespace std;

int main(){
    cout << (260 + 220) / (12 + 20) << endl;
    return 0;
}

注:需根据题目实际情况考虑是否需要将时间转换为浮点数。

例1-7:对角线

题目描述

对角线问题。一个长方形的长和宽分别是6cm、9cm,求它的对角线长度。

题解

解题思路:根据勾股定理可知,对角线长度为:

6 2 + 9 2 = 10.8167 \sqrt{6^{2} + 9^{2}}=10.8167 62+92 =10.8167

代码如下:

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

int main(){
    cout << sqrt(pow(6,2) + pow(9,2)) << endl;
    return 0;
}

代码说明:

  • #include 是引入cmath头部,里面保存着很多数学相关公式函数。

  • sqrt是用于取平方根

  • pow是用于取平方

  • 函数返回值是根据输入的参数类型决定的

例1-8:存钱

题目描述

存钱。Uim的银行账户里面有100元。经过了下面的操作:

1)往里面存了10元;

2)购物花掉了20元;

3)把里面的钱全部取出。

请在每次操作后输出账户余额,并使用换行符隔开。

解题思路

定义balance变量用于存放初始金额,变量类型为int型,依次执行后续操作,往里面存了十块钱,说明账户余额为初始金额+10,因此balance = balance + 10,购物花掉了20块,这时候账户余额在原先的基础上减去20元,这时候balance = balance - 20,将钱全部取出,这里balance = balance - balance了,即终值为0。

代码如下:

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

int main(){
    int balance = 100;
    balance = balance + 10;
    cout << balance  << endl;
    balance = balance - 20;
    cout << balance  << endl;
    balance = 0;
    cout << balance  << endl;
    return 0;
}

也可以使用 += 或者 -=来简化计算流程:

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

int main(){
    int balance = 100;
    balance += 10;
    cout << balance  << endl;
    balance -= 20;
    cout << balance  << endl;
    balance = 0;
    cout << balance  << endl;
    return 0;
}

例1-9:计算圆与球

题目描述

当半径r=5时,请输出圆的周长、面积和球体积。取π=3.141593.

题解

根据公式,圆的周长C=2πr,圆面积S=πr²,球体积=4/3πr³,算出对应值即可。

代码如下:

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

int main(){
    double r = 5;
    const double PI = 3.141593;
    cout << 2 * PI * r << endl;
    cout << PI * pow(r,2) << endl;
    cout << 4.0 /3 * PI * pow(r,3) << endl;
    return 0;
}

代码说明:

  • 如果经常使用的数值,可以通过const关键字定义为常量,常量名通常用采用大写。

  • 变量和常量命名规则如下

    1. 只能由英文字母、数字和下划线组成。

    2. 不能以数字开头

    3. 不能和其他关键字重复

    4. 变量名区分大小写,应采取见名知义的方式

例1-10:猴子吃桃

题目描述

猴子吃桃。一只小猴买了若干桃子。第一天它吃了这些桃子的一半之后,又贪嘴多吃了一个;第二天它也吃了剩余桃子的一半,又贪嘴多吃了一个;第三天它又吃了剩下的桃子的一半,并贪嘴多吃了一个。第四天起来一看,发现桃子只剩下一个。请问:小猴买了几个桃子?

题解

如果从第一天开始算一共购买了多少桃子不是很好算,由于我们已经知道了小猴吃桃子的过程以及最终所剩桃子的数量,不妨从后往前进行倒推即,第四天有一个桃子,第三天有(1+1) x 2=4个桃子,第二天有(4+1)x2=10个桃子,第一天有(10+1)x2=22个桃子。

代码如下:

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

int main() {
    int num = 1; //第四天
    num = (num + 1) * 2; //第三天
    num = (num + 1) * 2; //第二天
    num = (num + 1) * 2; //第一天
    cout << num <<endl;
    return 0;
}

上述代码也可以简化为如下代码:

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

int main() {
    cout << (((1+1)*2+1)*2+1)*2 << endl;
    return 0;
}

例1-11:评测机队列

题目描述

评测机队列。洛谷的评测任务是单位时间内均匀增加的。8台评测机30min可以刚好把评测队列中的程序评测完毕,10台评测机6min可以刚好把评测队列中的程序评测完毕。请问:几台评测机可以在10min时刚好把评测队列中程序评测完毕。

题解

第一种方法就是参考著名的牛吃草问题模型了,首先我们需要分析每分钟有多少的评测任务加入了队列,根据题意可以得知在(30-6)=24min内,增加了308-106=180份评测任务。因此我们可以得到每分钟增加了180/24=7.5份测评任务,接下来我们需要知道初始共有多少测评任务,我们就可以将60-6x7.5=15份,因此共有15+7.5x10=90份测评任务,要想在10分钟内测评完成,因此需要90/10=9台机器。

其实这道题有种非常简单的求解方法,因为8台评测机30分钟可以完成评测,10台评测机6分钟就可以完成评测,那么要想在10分钟内刚好完成评测机,那肯定就是9台了,因为不可以把评测机一分为二吧,因此就可以得出需要9台评测机。

代码如下:

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

int main() {
    int n1 = 8, t1 = 30, n2 = 10, t2 = 6;
    int t3 = 10;
    double inc_rate = (1.0 *  n1 * t1 - n2 * t2) / (t1 - t2); //增长速度
    double init_nun = n2 * t2 - inc_rate * t2;
    double ans = (init_nun + inc_rate * t3) / t3;
    cout << ans << endl;
}

习题1-1

题目描述

请将下列公式翻译成表达式。

3 x + 5 y 3x +5y 3x+5y

c + 1 a b \frac{c+1}{ab} abc+1

3 a 2 \sqrt{3a^{2}} 3a2

( n + 2 ) ( n − 9 ) (n+2)(n-9) (n+2)(n9)

题解

1、3 * x + 5 * y

2、(c + 1) / (a * b)

3、sqrt(3 * pow(a,2))

4、(n + 2) * (n - 9)

习题1-2

题目描述

下列变量名中,哪些是合法的,哪些是非法的?

(1)kkksc03

(2)OhILoveLuoguVeryMuchAndIWillStudy

(3)_lapple

(4)char

(5)kkk@SH

(6)a

(7)iPhone

(8)11dimensions

(9)__stdcall

题解

合法:

  • kkksc03

  • OhILoveLuoguVeryMuchAndIWillStudy

  • _lapple

  • a

  • iPhone

不合法

  • char (关键字)

  • kkk@SH(有特殊符号)

  • 11dimensions(以数字开头)

  • __stdcall(函数)

例1-3

题目描述

安装配置好环境,将本章例题的所有代码输入到计算器中,亲自运行这些程序

题解

编译环境搭建可以直接安装CLion或使用VScode。

例1-4

题目描述

编写程序解决以下问题,然后手工计算,验证答案。

(1)3名同学 3h 可以扫干净3间教室,那么9名同学 9h可以扫干净几间教室?
(2)长方形的长和宽之和是 24cm,长比宽多 4cm。请问:长方形的面积是多少?
(3)小A和 Uim 在程序设计竞赛中的得分之和是 480,Uim 的得分是小A的1.4倍。请问:他们分别得了多少分?
(4)给同学分苹果,若每人分 3个就剩下 11个;如果每人分4个则少一个。请问:有多少位同学,有多少个苹果?
(5)小A 每分钟输入20 个字符,Uim 每分钟输入80个字符,Uim 比小A 先开始打字12min。请问:小A开始打字多少时间后能赶上 Uim 的进度?
(6)兔子有4只脚,,鸡有2只脚。一个笼子里面有若干只免子和鸡,有35个头,94 只脚。请问:兔子和鸡分别有几只?
(7)银行定期存款年利率是一年定存3.5%,五年定存4%。小A 和 Uim 手上各有10000元。小A决定每次存一年期,到期后将连本带利再存一年,直到存满5年。Uim 直接存五年定期。请问:5年后他们分别有多少钱?

题解

1、3名同学 3h 可以扫干净3间教室,那么9名同学 9h可以扫干净几间教室?

解题思路:假定每名同学每小时扫干净的教室数相同,设为x。根据题意,3 * 3 * x = 3,解得x = 1/3。那么9名同学9小时可以扫干净9 * 9 * (1/3) = 27间教室。

代码如下:

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

int main() {
    int num_students = 9;
    int num_hours = 9;
    double classrooms_cleaned_per_student_hour = 3.0 / 3 / 3; // 每名同学每小时扫干净的教室数
    int total_classrooms = num_students * num_hours * classrooms_cleaned_per_student_hour;
    cout << "9名同学9小时可以扫干净 " << total_classrooms << " 间教室。" << endl;
    return 0;
}

2、长方形的长和宽之和是 24cm,长比宽多 4cm。请问:长方形的面积是多少?

解题思路:设长方形的宽为w,则长为w + 4。根据题意可得方程w + w + 4 = 24,解得w = 10,则长为14。面积A为长乘以宽,即A = w * (w + 4)

代码如下:

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

int main() {
    int perimeter_half = 24 / 2;  // 长和宽之和的一半
    int width = perimeter_half - 4;  // 宽
    int length = width + 4;  // 长
    int area = width * length;  // 面积
    cout << "长方形的面积是 " << area << " 平方厘米。" << endl;
    return 0;
}

3、小A和 Uim 在程序设计竞赛中的得分之和是 480,Uim 的得分是小A的1.4倍。请问:他们分别得了多少分?

解题思路:设小A得分为a,则Uim得分为1.4a。根据题意可得方程a + 1.4a = 480,解得a = 200,Uim得分为280

代码如下:

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

int main() {
    int total_score = 480;
    double ratio = 1.4;
    int score_a = total_score / (1 + ratio);
    int score_uim = total_score - score_a;
    cout << "小A得了 " << score_a << " 分,Uim得了 " << score_uim << " 分。" << endl;
    return 0;
}

4、给同学分苹果,若每人分 3个就剩下 11个;如果每人分4个则少一个。请问:有多少位同学,有多少个苹果?

解题思路:设同学数量为n,苹果数量为a。可以建立两个方程:3n + 11 = a4n - 1 = a。可以通过解这两个方程得到na

代码如下:

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

int main() {
    int remaining_apples_when_3 = 11;
    int missing_apples_when_4 = -1;
    int students = (remaining_apples_when_3 - missing_apples_when_4) / (4 - 3);
    int apples = 3 * students + remaining_apples_when_3;
    cout << "有 " << students << " 位同学,有 " << apples << " 个苹果。" << endl;
    return 0;
}

5、小A 每分钟输入20 个字符,Uim 每分钟输入80个字符,Uim 比小A 先开始打字12min。请问:小A开始打字多少时间后能赶上 Uim 的进度?

解题思路:小A的速度是每分钟20个字符,Uim的速度是每分钟80个字符。Uim比小A多打了12 * 80个字符。小A要赶上Uim,就要打这么多字符。速度差是80 - 20,则需要(12 * 80) / (80 - 20)分钟。

代码如下:

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

int main() {
    int speed_a = 20;
    int speed_uim = 80;
    int lead_time_uim = 12;
    int catch_up_time = (lead_time_uim * speed_uim) / (speed_uim - speed_a);
    cout << "小A开始打字 " << catch_up_time << " 分钟后能赶上 Uim 的进度。" << endl;
    return 0;
}

6、兔子有4只脚,,鸡有2只脚。一个笼子里面有若干只免子和鸡,有35个头,94 只脚。请问:兔子和鸡分别有几只?

解题思路:设兔子数量为r,鸡的数量为c。兔子和鸡的总头数为r + c = 35,总脚数为4r + 2c = 94。可以通过解这两个方程得到rc

代码如下:

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

int main() {
    int total_heads = 35;
    int total_feet = 94;
    int rabbits = (total_feet - 2 * total_heads) / 2;
    int chickens = total_heads - rabbits;
    cout << "兔子有 " << rabbits << " 只,鸡有 " << chickens << " 只。" << endl;
    return 0;
}

7、银行定期存款年利率是一年定存3.5%,五年定存4%。小A 和 Uim 手上各有10000元。小A决定每次存一年期,到期后将连本带利再存一年,直到存满5年。Uim 直接存五年定期。请问:5年后他们分别有多少钱?

解题思路:小A每年存一次,用复利计算。Uim存五年,用单利计算。可以分别用复利和单利公式计算他们各自5年后的总金额。

代码如下:

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

int main() {
    double principal = 10000.0;
    double rate_a = 0.035;
    double rate_uim = 0.04;
    int years = 5;

    // 复利计算
    double amount_a = principal * pow(1 + rate_a, years);

    // 单利计算
    double amount_uim = principal * (1 + rate_uim * years);

    cout << "5年后小A有 " << amount_a << " 元,Uim有 " << amount_uim << " 元。" << endl;
    return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考
### 回答1: 《洛谷深入浅出程序设计竞赛(基础) pdf》是一本关于程序设计竞赛基础知识的书籍,主要面向初学者。本书作者通过深入浅出的方式,以简洁清晰的语言讲解了程序设计竞赛中常见的基础知识和技巧。 该书首先介绍了算法和数据结构的基本概念,包括常见的排序算法、栈、队列、链表、树等数据结构。然后,详细讲解了常用的算法设计技巧,如贪心算法、动态规划、递归等,并通过大量的例题进行了实践演练,使读者能更好地理解和掌握这些技巧。 此外,本书还介绍了常见的编程语言和开发环境,如C++、Python和Java等,并提供了一些常用的程序调试技巧和工具,帮助读者解决实际编程过程中可能遇到的问题。 《洛谷深入浅出程序设计竞赛(基础) pdf》还包含了大量的习题和实例,供读者进行练习和巩固所学知识。同时,书中还提供了一些实战经验和竞赛技巧,帮助读者提高在程序设计竞赛中的表现。 总的来说,《洛谷深入浅出程序设计竞赛(基础) pdf》适合初学者入门,内容全面、易懂,对于想要了解程序设计竞赛基础知识和提升编程能力的人来说是一本很好的参考书。 ### 回答2: 《洛谷深入浅出程序设计竞赛(基础) pdf》是一本内容丰富、有助于初学者提高编程能力的书籍。该书主要介绍了洛谷这个在线判题系统的使用方法以及一些常见的算法和数据结构知识。 首先,书中详细介绍了洛谷这个在线判题系统的功能和使用方法。洛谷是一个非常受欢迎的在线编程平台,它提供了丰富的题目和在线编译环境,使得用户可以更加方便地练习和学习编程。书中通过简单明了的语言和图文并茂的示例,向读者介绍了洛谷的登录、题目搜索、代码提交等基本操作,帮助读者迅速上手这个平台。 其次,书中系统地介绍了一些常见的算法和数据结构知识。这对于初学者来说,是非常重要的一部分。书中通过具体的例子和详细的讲解,向读者介绍了一些常见的算法,如搜索、排序和动态规划等。同时,书中还提供了一些实操编程题目,使得读者可以通过练习加深对这些算法的理解和掌握。 总的来说,《洛谷深入浅出程序设计竞赛(基础) pdf》是一本对于初学者来说非常有价值的书籍。它通过详细的介绍洛谷系统的使用方法和常见算法的讲解,帮助读者快速入门,并且提高编程能力。阅读这本书,不仅可以帮助初学者更好地了解和使用洛谷系统,还可以提供一些常见算法的思路和实践经验,对于参加编程竞赛和提升编程能力有着积极的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值