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
随着蓝桥杯省赛的临近,建议多训练算法来提升比赛成绩