CSDN27期竞赛

文章提供了四个编程问题的解决方案,包括检查幸运数字的条件、计算投篮的最长连续得分、设计X国的货币系统以及寻找特定数值最后一位的来源。这些问题涉及字符串处理、序列分析和数学逻辑,适合提升算法和编程技能。
摘要由CSDN通过智能技术生成

1,幸运数字

小艺定义一个幸运数字的标准包含3条: 1、仅包含4或7。 2、幸运数字的前半部分数字之和等于后半部分数字之和。 3、 数字的长度是偶数。

思路:先排除长度为奇数,再排除包含数字01235689的,最后对比前半段与后半段的和是否相等

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char a[1002];
    cin>>a;
    int n=strlen(a);
    if(n%2==1){//检测长度是否为奇数
        cout<<"No";
        return 0;
    }
    int h1=0,h2=0;//h1为前半段,h2为后半段
    for(int i=0;i<n;i++){
        if(a[i]!='4'&&a[i]!='7'){//检测是否包含01235689
            cout<<"No";
            return 0;
        }
        if(i<n/2)h1+=a[i];//记录前半段的和
        else h2+=a[i];//记录后半段的和
    }
    if(h1==h2)cout<<"YES";//检测h1,h2是否相等
    else cout<<"No";
    return 0;
}

2,投篮

小明投篮,罚球线投球可得1分,在三分线内投篮得分可以得到2分,在三分线以外的地方投篮得分可以得到3分,连续投 进得分累计,一旦有一个球没投进则得分清零,重新计算。现给出所有得分记录(清零不计入得分),请你计算一下小明 最多连续投进多少个球?

思路:求最长单调递增区间

#include <iostream>
using namespace std;
int main() {
    int n,ans=1,m=1;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=1;i<n;i++){
        if(a[i]>a[i-1]){//检测是否为单调递增序列
            ans++;//如果是则记录递增长度
            if(ans>m)m=ans;//记录并更新最大值
        }else ans=1;//如果不是则重置递增长度
    }
    cout<<m;
}

3,通货膨胀-x国货币

X国发行货币最高面额为n。 次高面额为n的因子。 以此类推。 X国最多发行多少种货币。

思路,求n的各个质因数的次方数的和+1

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int solution(int n){
    int result=1;
    // TODO:
    int i=2;
    while(n>1){
        while(n%i==0){
            result++;
            n/=i;
        }
        i++;
    }
    return result;
}
int main() {
    int n;
    std::cin>>n;
    int result = solution(n);
    std::cout<<result<<std::endl;
    return 0;
}

4,最后一位

小明选择了一个正整数X,然后把它写在黑板上。然后每一天他会擦掉当前数字的最后一位,直到他擦掉所有数位。 在整个过 程中,小明会把所有在黑板上出现过的数字记录下来,然后求出他们的总和sum. 例如X = 509, 在黑板上出现过的数字依次 是509, 50, 5, 他们的和就是564. 小明现在给出一个sum,小明想让你求出一个正整数X经过上述过程的结果是sum.

代码1(TLE)

#include <iostream>
using namespace std;
long long s(long long a){
	long long sum=a;
	while(a>0){
		a/=10;
		sum+=a;
	}
	return sum;
}
int main() {
	long long sum;
    cin>>sum;
	for(long long i=0;i<sum;i++){
		if(s(i)==sum){
			cout<<i;
			return 0;
		}
	} 
	return 0;
}

本代码的时间复杂度为O(n),当sum>4*10^7就会超时

代码2(TLE)

#include <iostream>
using namespace std;
long long s(long long a){
	long long sum=a;
	while(a>0){
		a/=10;
		sum+=a;
	}
	return sum;
}
int main() {
	long long sum;
	cin>>sum;
	for(long long i=sum;i>=0;i--){
		if(s(i)==sum){
			cout<<i;
			return 0;
		}
	} 
	return 0;
}

本代码的时间复杂度为O(n),当sum>3*10^8就会超时

代码3(AC)

#include <iostream>
using namespace std;
long long s(long long a){
    long long sum=a;
    while(a>0){
        a/=10;
        sum+=a;
    }
    return sum;
}
int main() {
    long long sum;
    cin>>sum;
    long long l=0,r=sum;
    while(l<=r){
        long long mid=(l+r)/2;
        if(s(mid)<sum){
            l=mid+1;
        }else if(s(mid)>sum){
            r=mid-1;
        }else{
            cout<<mid;
            break;
        }
    }
    return 0;
}

本代码的时间复杂度为O(logn),当sum=10^18时,O(logn)=60

随着蓝桥杯省赛的临近,建议多训练算法来提升比赛成绩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_59716586

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值