假期练习——时间复杂度

重要知识点:时间复杂度

时间复杂度:程序运行会消耗多少时间。

计算时间复杂度的方法如下:

1.忽略常数项。
2.忽略系数。
3.只保留最高项。

常见的时间复杂度:从小到大依次是:O(1)<o(logn)<O(n)< O(nlogn)< O(n^2)< O(n^3)<O(2^n)<O(n!)

 练习题如下:

第一个题

P2249 【深基13.例1】查找

题目描述

输入 n 个不超过 10^9 的单调不减的(就是后面的数字不小于前面的数字)非负整数a1​,a2​,…,an​,然后进行 m次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1 。

输入格式

第一行 2个整数 n和 m,表示数字个数和询问次数。

第二行 n个整数,表示这些待查询的数字。

第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。

输出格式

输出一行,m 个整数,以空格隔开,表示答案。

输入输出样例

输入 

11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6

输出 

1 2 -1 

说明/提示

数据保证,1≤n≤10^6, 0≤ai​,q≤10^9, 1≤m≤10^5

本题输入输出量较大,请使用较快的 IO 方式。


题解如下:

第一次的时候两个for循环 ,超时了 ,时间复杂度为o(nm)

#include<bits/stdc++.h>
using namespace std;
int  n, m;
int a[1000005],b[1000005];
int main(){
	cin >> n >> m;
	for(int i=1;i<=n;i++)
		cin >> a[i];
	for(int i=1;i<=m;i++)
		cin >> b[i];
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				if(b[i] == a[j]){
					cout << j<<" ";
					break;
				}
				if(j == n)
				cout << -1 << " ";
			}
			
		}
		return 0;
}

 第二次优化了之后,用了二分查找 时间复杂度为:O (log 2 n)

#include<bits/stdc++.h>
using namespace std;
int  n, m;
int a[1000005],b[1000005];
int find(int a[],int l,int r,int k){
	if(l == r){
		if(a[l] == k)
		return l;
		else
		return -1;
	}
	int mid =(l+r)/2;
	if(k<=a[mid]){
		find(a,1,mid,k);
	}
	else
	find(a,mid+1,r,k);
}
int main(){
	cin >> n >> m;
	for(int i=1;i<=n;i++)
		cin >> a[i];
	for(int i=1;i<=m;i++)
		cin >> b[i];
		for(int i=1;i<=m;i++){
			cout << find(a,1,n,b[i]) << " ";
		}
		return 0;
}

 第二个题

P8780 [蓝桥杯 2022 省 B] 刷题统计

题目描述

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a道题目,周六和周日每天做 b道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?

输入格式

输入一行包含三个整数 a, b 和 n

输出格式

输出一个整数代表天数。

输入输出样例

输入 

10 20 99

输出 

8

说明/提示

对于 50% 的评测用例, 1≤a,b,n≤10^6

对于 100% 的评测用例, 1≤a,b,n≤10^18

蓝桥杯 2022 省赛 B 组 C 题。

题解如下:


题解如下:

注意用 long long  因为a,b的范围到了10的8次方

用 while 循环 循环 条件是 当ant(当前做题量)小于n时

用 i 和7 取余  使 i 的取值在1-7之间

在增加天数即可

#include<bits/stdc++.h>
using namespace std;
long long  a,b,n;
long long day=0,ant=0;
int main(){
	
	long long i=1;
	cin >> a >> b >>n;
	while(ant<n){
		if(i<=5){
			ant+=a;
		}
		else{
			ant+=b;	
		}
		i = i%7+1; 
		++day;
	}
	cout << day;
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值