7.15-7.16简单数学题、数组字符串练习精讲

简单数学题、数组字符串练习

A - Together


题目描述

在这里插入图片描述


题意分析

题意:k个好人和k个坏人围成一圈,数到m的人出局,求最小的m,使得k个坏人在第一个好人之前均被处决。

分析:我们可以用0-k-1为好人,k到2k-1为坏人,m从k开始暴力枚举,最后打表



解题思路


最关键的是出局的坏人的编号,我们用tmp=0从0开始,然后遍历k次,如果tmp这个编号在0到k-1的位置,此时好人出局,不符合,找下一个m。其中出局人的编号是tmp=(tmp+m-1)%(2k-i)。


复杂度分析


外层的while循环用于不断接收输入的k值,直到用户输入0为止。由于只读取k值一次,并且每次迭代之间独立,所以时间复杂度为O(1)。

内层的while循环会不断增加起始位置m的值,直到找到满足条件的m值。最坏情况下,m的值会增加到2*k-1,因此内层while循环的最大迭代次数为O(k)。

内层while循环中,还有一个for循环,它需要执行k次,所以它的时间复杂度为O(k)。

在for循环内部,进行了一些基本的算术运算(加法、减法和取模),这些运算的时间复杂度都是O(1)。

因此,整体算法的时间复杂度为O(k^2)


带注释的代码
#include <iostream>
using namespace std;

int main(){
    int k,i; //这里是0-k-1是好人,k到2*k-1坏人
    while(cin>>k&&k!=0) {  //输入k并且k不等于0
        bool flag=false; //先假设不符合要求
        int m=k; //肯定要从k开始,如果m是0-k-1的数,那就把好人出局了,不符合条件
        while(!flag){ //当m仍然不符合条件的时候
            m++; //m再往后大一位
            int tmp=0; //起点是0,给tmp,下次tmp值要变化
            for (i=0;i<k;i++){ //想要让0-k-1的坏人出局
                tmp=(tmp+m-1)%(2*k-i); /*出局者编号,因为本身算1个,所以再数m-1个就数到m了,
                                         后面%的是环成员个数,在不断减小
                                         开始是2k个人,然后2k-1,人数逐渐减少
                                         */
                if(tmp<=k-1) break; //如果编号是在0-k-1范围内,好人出局了,不符合条件 
                if(i==k-1) flag=true; //0-k-1坏人均被淘汰。
            }
        }
        printf("%d\n",m);
    }
    return 0;
}

C - Fibonacci Again

在这里插入图片描述


题意分析
题意:对于给定的每行的n,看其值是否是3的倍数,如果是的话就输出yes,否则输出no
分析:找规律即可

解题思路
我们发现从n=2开始,每次往后4个都是3的倍数,所以n%4余下2的数都是符合条件的数
复杂度分析

时间复杂度:每次读取一个整数n,判断是否被4整除余2,时间复杂度为O(1)。

空间复杂度:没有使用额外空间,空间复杂度为O(1)。

算法的总体时间和空间复杂度如下:

时间复杂度:O(1)

空间复杂度:O(1)

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    while (cin >> n) {
        if (n == 0) {
            cout << "no" << endl;
            continue;
        }
        if (n % 4 == 2) {
            cout << "yes" << endl;
        } else {
            cout << "no" << endl;
        }
    }
    return 0;
}

D - Rightmost Digit

在这里插入图片描述


题意分析
题意:找N的N次方的末尾数字
分析:找规律即可

解题思路
我们可以从3开始看,第一个数3,第二个数9,第三个数27,第四个数81,第五个数243,第六个数729,4个一循环,3,9,7,1
复杂度分析
  • 时间复杂度 O(1) : 只需要常数次求幂和取余运算,所以时间复杂度为 O(1)。
  • 空间复杂度 O(1) : 只需要常数大小的数组a来存储结果,所以空间复杂度为 O(1)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    ll t;
    cin>>t;
    while(t--) {
        ll n; 
        cin>>n;
        ll a[5];
        ll k=n;
        for(int i=1;i<=4;i++) { //把前4次末尾的数字存到数组1-4
            a[i]=k%10;
            k=(k*n)%10;  //这里数可能过大,只要取出末尾数字即可
        }
        ll index=n%4; 
        if(index==0) index=4; //注意:如果是0的话是1-4个循环的第4个
        cout<<a[index]<<endl; //输出即可
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值