时空复杂度的分析
时间复杂度:
时间复杂度是程序运行所要消耗的时间。
编写程序前可以大概计算时间复杂度,看程序运行是否超时。
常见的时间复杂度:
从小到大依次是:
O(1)<O(logn)<O(n)< O(nlogn)< O ( n^2 ) <O ( n^3 )<O(2^n)<O(n!)
计算一个程序的时间复杂度
1.忽略常数项。
2.忽略系数。
3.只保留最高项。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cout<<"hello"<<endl;
}
return 0;
}
该程序的时间复杂度就为O(n)。
练习题
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
ll a,b,n;
cin>>a>>b>>n;//a周一到周五做题量,b周末做题量
ll m=a*5+2*b;
ll sum=0;
if(n%m==0)
{
sum=n/m*7;// n/m需要多少个星期正好做完
}
else
{
sum=n/m*7;
n=n-n/m*m;//n还差多少道题
for(int i=1;i<=7;i++)
{//还差多少道题,再做i天题做完
if(i==6||i==7)
n=n-b;
else
n=n-a;
if(n<=0)
{
sum+=i;
break;
}
}
}
cout<<sum;
return 0;
}
解题思路
- 1秒测评机 会执行10^9次运算,对于 100% 的评测用例,1<=a,b,n<=10^18, O(n)=10^6执行时间小于1秒,所以通过的测试点会超时或者报错,不能直接使用暴力方法
- 首先计算出一个星期的总刷题量,判断需要几个星期可以做完
- 如果不能正好几个星期做完,n=n-n/m*m计算还差多少道题(一个星期内肯定可以做完),再判断需要多少天可以全部做完。