第一节 时空复杂度的分析
一.时空复杂度的分析
1.时间复杂度
在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
常见的时间复杂度:从小到大依次是:O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)
<O(n^3)
<O(2^n)<O(n!)
1.O(1)
int a = 1;
int b= 1;
int c = a + b;
2.O(logn)、O(nlogn)
int i = 1;
int n = 10;
while (i <= n) {
i = i * 2;
}
3.O(m+n)、O(m*n)
int fun(int m, int n) {
int s = 0;
int i = 1;
for (; i < m; ++i) {
s = s + i;
}
int k = 0;
int j = 1;
for (; j < n; ++j) {
k = k + j;
}
return s + k;
}
2.P8780 [蓝桥杯 2022 省 B] 刷题统计
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?
输入格式
输入一行包含三个整数 a, b和 n.
输出格式
输出一个整数代表天数。
输入输出样例
输入
10 20 99
输出
8
#include<iostream>
using namespace std;
long long a,b,n,s,x,y;
int main()
{
cin>>a>>b>>n;//周一至周五每天做a道题目,周六和周日每天做b道题目,目标做题数n
s=5*a+2*b;//一周的做题总数
x=n/s;//算出需要做几个整周
if(n/s*s==n)//判断做题总天数是不是整周
cout<<x*7;
y=n-x*s;//不是整周减去整周部分,准备将剩余部分判断
if(y>5*a)//判断是否大于5天
{
if((y-5*a)>b)//判断是6天还是7天
cout<<x*7+7;
else cout<<x*7+6;
}else if(y/a*a==y)//判断做题数是否恰好为a的倍数
{
cout<<x*7+y/a;
}else cout<<x*7+y/a+1;//若不是向后+1;
return 0;
}