寒假集训第一节课后作业(时间复杂的的分析)

 洛谷:https://www.luogu.com.cn/problem/P8780

#include <iostream>

using namespace std;

int main()
{
    long long a,b,n;
    cin>>a>>b>>n;
    long long num=0;
    for(long long i=1;;i++){
    if(  i%7==6 ||  i%7==0 ) num+=b;
    else num+=a;
    if(num>=n){
        cout<<i<<endl;
        break;
    }
    }
    
    return 0;
}

 题目分析:首先该题对于100%的数据为10^{18}所以本题只能用long long或unsigned long long,本人更喜欢用long long 因为long long敲起来更简单,所以在定义的时候要使用long long。

代码分析:我们用一个for循环在里面进行一些列操作,而且没有给它一个终止条件,我们可以在循环里面加上一个终止条件,还要定义一个数来储存小明做的题数,所以定义了一个num,再来个if-else来判断条件就是i%7==6和i%7==0表示是星期六和星期天,这个时候num+=b,其他的则是星期一到星期五,这个时候num+=a,而当num>=n时,我就可以输出i,这个时候就可以为大家解释一下为什么一开始没给这个for循环设置终止条件,而且还没有超时,因为我们这个终止条件在for循环里面,而且当num大于n时就会立马终止循环相当于num和n是一个范围所以不会报错。(纯属于个人理解)

 洛谷:https://www.luogu.com.cn/problem/P2249

第一次(暴力,报错):

#include <iostream>
int a[100000005];
using namespace std;
int main()
{
    int n,m,b;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++){
        cin>>b;
        for(int j=1;j<=n;j++){
            if(a[i]==b){
                cout<<i<<" ";
                break;
            }else{
                cout<<-1<<" ";
                break;
            }
        }
    }
    return 0;
}

第二次尝试(二分,完美通过): 

#include <iostream>
int a[100000005];
using namespace std;

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    while(m--){
        int x;
        cin>>x;
        int l=1,r=n;
        while(l<r){
            int mid=(l+r)/2;
            if(a[mid]>=x){
                r=mid;
            }else{
                l=mid+1;
            }
        }
        if(a[l]==x) cout<<l<<" ";
        else cout<<-1<<" ";
    }
    return 0;
}

 题目分析:题目要求的数据范围为10^{9},所以用int。

代码分析:第一次尝试使用暴力的方法,虽然案例正确了,可是它这个数据最大范围却超过了10^{9},因为暴力尝试的数据最大范围为10^{11},所以我们可以在循环里面使用二分优化,让其数据最大范围约为2*10^{6}

总结:

(该图借用博客小Q:https://blog.csdn.net/qq_53244181/article/details/128381176?spm=1001.2014.3001.5502) 这一节让我学会了对算法时间复杂度的分析有了更深一步的了解,学会对时间复杂度的运用,首先要了解基本操作认为时间复杂度O(1),顺序结构时间复杂度按加法计算,循环结构时间复杂度按乘法计算,分支结构按最大值计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值