【深入浅出程序设计竞赛(基础篇)第一章 算法小白从0开始】

深入浅出程序设计竞赛(基础篇)第一章 算法小白从0开始

  • 第一章 例题
    • 例1-1
    • 例1-2
    • 例1-3
    • 例1-4
    • 例1-5
    • 例1-6
    • 例1-7
    • 例1-8
    • 例1-9
    • 例1-10
    • 例1-11
  • 第一章 课后习题
    • 1-1
    • 1-2
    • 1-3
    • 1-4

第一章 例题

例1-1

#include
using namespace std;

int main(){
    cout << "I love Lugou !";
    return 0;
}

例1-2

#include
using namespace std;

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

例1-3

#include
using  namespace std;

int main(){
    cout << 14 / 4 << endl; // 向下取整为3
    cout << 14 / 4 * 4 << endl;
    cout << 14 % 4 << endl;
    return 0;
}

例1-4

#include
using namespace std;

int main(){
    cout << 500.0 / 3 << endl; //整数 加减乘除模 还是 整数,浮点数 加减乘除模 是 小数
    return 0;
}

例1-5

#include
using namespace std;

int main(){
    cout << 500.0 / 3 << endl; // cout输出浮点数默认保留不超过6位有效数字,如果数字过大或过小就会使用科学计数法输出。同样保留不超过6位有效数字
    cout << 5000000.0 / 3 << endl;
    cout << 0.000005 / 3 << endl;
    cout << 5e6 / 3 + 5e-6 / 3 - 5e6 / 3 << endl; //计算机的存储方式决定了浮点数能够表示的精度是有限的,后面章节会讨论
    return 0;
}

例1-6

#include
using namespace std;

int main(){
    //假设甲车是静止的,那么乙车的总路程为 260 + 220,乙车的车速为  (12 + 20) /s
    cout << ( 260 + 220 ) / ( 12 + 20 ) << endl;
    return 0;
}

例1-7

#include
#include //sqrt()、pow()两个函数与这个库有关
using namespace std;

int main(){
    cout << pow(6, 2) << endl;  //书中说返回的是浮点数,但是输出的值为36是整数,可能小数点自动省略了?
    cout << sqrt(pow(6, 2) + pow(9, 2)) << endl;
    return 0;
}

// cmath库中的常用数学函数
//double sin(double x)  正弦
//double cos(double x) 余弦
//double exp(double x) 指数
//double log(double x) 对数
//double pow(double x, double y) 多次方
//double sqrt(double x) 算数平方根
//double fabs(double x) 绝对值
//double ceil(double x) 上整数 >=x
// double floor(double x) 下整数 <=x

例1-8

#include
using namespace std;

int main(){
    int balance = 100; //初始余额
    balance = balance + 10;
    cout << balance << endl;
    balance -= 20;
    cout << balance  << endl;
    balance = 0;
    cout << balance << endl;
    return 0;
}

例1-9

#include
#include
using namespace std;

int main(){
    double r = 5;
    const double PI = 3.141593; //定义常量,一经定义在程序运行中无法修改,习惯将常量名用大写字母定义
    //#define PI 3.141593 这种方法定义常量无需确定其数据类型
    cout << 2 * PI * r << endl;
    cout << PI * r * r << endl;
    cout << PI * r * r << endl;
    cout << 4.0 / 3 * PI * pow(r, 3) << endl; //不能写成 4/3*PI*pow(r, 3)
    return 0;
}

例1-10

#include
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;
}

例1-11

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

分析: 这是著名的“牛吃草问题”的模型。假设1台评测机1min可以评测1份程序。
首先需要分析每分钟有多少新程序进入评测队列。8台评测机30min可以评测240份,而10台评测机6min可以评测60份,可以得到30min-6min=24min内,增长了240份-60份=180份程序。因此,每分钟程序的增长速度是(240-60)/(30-6) = 7.5份/min。
6min可以评测60份,其中6 * 7.5 = 45份是新提交的程序,原有队列里面有60-45=15份程序。评测机10min一共需要评测15+10*7.5=90份程序,所以需要90/10=9台。根据这个思路,可以写出如下程序:

#include
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_num = n2 * t2 - inc_rate * t2;  //初始队列长度
    double ans = (init_num + t3 * inc_rate) /  t3; //求得答案
    cout << ans; 
    return 0;
}

这个问题相比于前面的问题来说比较复杂,很难使用一个表达式来直接求得结果。可以把一个大人物拆分成若干规模比较小的任务,抽丝剥茧,逐步击破,直到求得最终的答案。

补充:牛吃草问题
有一片青草地,每天都匀速地长出青草,这片青草可供27头牛吃6周或供23头牛吃9周,那么这片草地可供21头牛吃几周?

#include
using namespace std;

int main(){
    //假设每头牛每周吃1棵草
    int n1 = 27, t1 = 6, n2 = 23, t2 =  9;

    int n3 = 21;  //题目给的牛的数量
    double inc_rate = (1.0 * n2 * t2 - n1 * t1)  / (t2 - t1);  // 每周草的增长速度
    double init_num = n1* t1 - inc_rate * t1;  //初始草的数量
    //  21头牛分为15把每周增长的草吃掉,那么只需直到剩下的6头把初始的草吃掉需要多长时间即可
    double ans = init_num / (n3 - inc_rate); //求得答案
    cout << ans; 
    return 0;
}

第一章 课后习题

1-1

(1) 3 * x + 5 * y
(2) (c + 1) / (a * b)
(3) sqrt(3 * pow(a, 3))
(4) (n + 2) * (n - 9)

1-2

//C++变量命名规则
// 1、 变量名只能是字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成。
// 2、 第一个字母必须是字母或者下划线开头。
// 3、 不能使用C++关键字来命名变量,以免冲突。
// 4、 变量名区分大小写。

(1) kkksc03 合法
(2) OhILoveLuoguVeryMuchAndIWiIIStudy 合法(但是名称太长了)
(3) _1apple 合法
(4) char 不合法 关键字
(5) kkk@SH 不合法 含有@
(6) a 合法
(7) iPhone 合法
(8) 11dimensions 不合法 以数字开头
(9) __stdcall 不合法,是函数

1-3

1-4

#include
using namespace std;

int main(){
    cout << 3.0 / 3 / 3 * 9 * 9 << endl; //1
    cout << ((24 - 4) / 2) * ((24 - 4) / 2 + 4) << endl; //2
    cout << 480 / (1.4 + 1) << " " << 480 / (1.4 + 1) * 1.4 << endl; //3
    cout << 11 + 1 << " " << 3 * (11 + 1) + 11 << endl; //4
    cout << 80 * 12 / (120 - 80) << endl; //5
    int x = (94 - 35 * 2) / 2 ; 
    int y = 35 - x; 
    cout << x << " " << y << endl; //6
    double a = 10000 * (1 + 0.035) * (1 + 0.035) * (1 + 0.035) * (1 + 0.035) * (1 + 0.035);
    double b = 10000 * (1 + 0.04);
    cout << a  << " " << b << endl;
    return 0;
}

你可能感兴趣的:(算法,c++,数据结构)