2018年第九届CC++A组蓝桥杯省赛真题部分题解(C语⾔C++)
⽬录
哪天返回
题⽬描述 ⼩明被不明势⼒劫持。后莫名其妙被扔到x星站再⽆问津。⼩明得知每天都有飞船飞往地球,但需要108元的船票,⽽他却⾝⽆分⽂。 他决定在x星战打⼯。好⼼的⽼板答应包⾷宿,第1天给他1元钱。 并且,以后的每⼀天都⽐前⼀天多2元钱,直到他有⾜够的钱买票。请计算⼀下,⼩明在第⼏天就能凑够108元,返回地球。
明解c语言要求提交的是⼀个整数,表⽰第⼏天。请不要提交任何多余的内容。
题⽬分析
⼀个简单的循环即可。
题⽬代码
————————————————
#include<stdio.h>
int main()
{
int sum =0;
int i =1;
int day =1;
while(sum<108)
{
day++;
sum = sum+i+2*(day-1);
}
printf("%d",day);
return0;
}
猴⼦分⾹蕉
题⽬描述 5只猴⼦是好朋友,在海边的椰⼦树上睡着了。这期间,有商船把⼀⼤堆⾹蕉忘记在沙滩上离去。 第1只猴⼦醒来,把⾹蕉均分成5堆,还剩下1个,就吃掉并把⾃⼰的⼀份藏起来继续睡觉。 第2只猴⼦醒来,重新把⾹蕉均分成5堆,还剩下2个,就吃掉并把⾃⼰的⼀份藏起来继续睡觉。 第3只猴⼦醒来,重新把⾹蕉均分成5堆,还剩下3个,就吃掉并把⾃⼰的⼀份藏起来继续睡觉。 第4只猴⼦醒来,重新把⾹蕉均分成5堆,还剩下4个,就吃掉并把⾃⼰的⼀份藏起来继续睡觉。 第5只猴⼦醒来,重新把⾹蕉均分成5堆,哈哈,正好不剩!
请计算⼀开始最少有多少个⾹蕉。
需要提交的是⼀个整数,不要填写任何多余的内容。
题⽬分析
本题主要在于多次使⽤if进⾏条件的限制即可,接着从1开始枚举数字直到符合题意,即符合多次的if条件即可输出。
题⽬代码
————————————————
#include<stdio.h>
int main()
{
int i =1;
while(i>=1)
{
if((i-1)%5==0&&i!=1)
{
int temp1 = i-1-(i-1)/5;
if((temp1-2)%5==0&&temp1!=2)
{
int temp2 = temp1-2-(temp1-1)/5;
if((temp2-3)%5==0&&temp2!=3)
{
int temp3 = temp2-3-(temp2-1)/5;
if((temp3-4)%5==0&&temp3!=4)
{
int temp4 = temp3-4-(temp3-1)/5;
if(temp4%5==0&&temp4!=0)
{
printf("%d",i);
break;
}
}
}
}
}
i++;
}
return0;
}
第⼏个幸运数
题⽬描述 到x星球旅⾏的游客都被发给⼀个整数,作为游客编号。 x星的国王有个怪癖,他只喜欢数字3,5和7。 国王规定,游客的编号如果只含有因⼦:3,5,7,就可以获得⼀份奖品。
我们来看前10个幸运数字是: 3 5 7 9 15 21 25 27 35 45 因⽽第11个幸运数字是:49
⼩明领到了⼀个幸运数字 59084709587505,他去领奖的时候,⼈家要求他准确地说出这是第⼏个幸运数字,否则领不到奖品。
请你帮⼩明计算⼀下,59084709587505是第⼏个幸运数字。
需要提交的是⼀个整数,请不要填写任何多余内容。
题⽬分析
这与⼒扣的⼀题⾮常相似,具体思路可以参考我的博客。
具体思路就是从反⾯出发,我们不需要⼀个⼀个枚举从1到题中所给数字的所有满⾜条件的数,我们只
需要到题⽬所要求的那些符合条件的数即可。
因此我们不需要使⽤枚举+条件选择来进⾏模拟,我们可以直接“”出对应数字,从1开始直到到对应数字即可。
因此使⽤动态规划的思路即可。
题⽬代码
————————————————
#include<stdio.h>//这⾥我模拟的是幸运数在10000以内的情况下的通⽤程序,此题所给幸运数过⼤,将int改为long long即可int least(int a,int b,int c)
{
int temp = a<b?a:b;
return temp<c?temp:c;
}
int main()
{
int n;
scanf("%d",&n);
int nums[10000]={0};
int p =0;
int q =0;
int r =0;
nums[0]=1;//i代表第⼏个
int i;
for(i=1;;i++)
{
nums[i]=least(nums[p]*3,nums[q]*5,nums[r]*7);
if(nums[i]==nums[p]*3)
{
p++;
}
if(nums[i]==nums[q]*5)
{
q++;
}
if(nums[i]==nums[r]*7)
{
r++;
}
if(nums[i]==n)
{
printf("%d",i);
break;
}
}
return0;
}
以下是我从别⼈博客看到的***使⽤C++***的另⼀种⽅式
#include<bits/stdc++.h>
using namespace std;
const int a[]={3,5,7};
const long long maxn =49;
priority_queue<long long,vector<long long>,greater<long long>>p;
set<long long>s;
int res;
int main(){
long long n,m;
for(int i =0;i <3;i++)p.push(a[i]);
while((n = p.top())<=maxn){
p.pop();
res++;
for(int i =0;i <3;i++){
m = n*a[i];
if(!s.count(m)){
s.insert(m);
p.push(m);
}
}
}
cout << res;
return0;
}
书号验证
题⽬描述 2004年起,国际ISBN中⼼出版了《13位国际标准书号指南》。 原有10位书号前加978作为商品分类标识;校验规则也改变。校验位的加权算法与10位ISBN的算法不同,具体算法是: ⽤1分别乘ISBN的前12位中的奇数位(从左边开始数起),⽤3乘以偶数位,乘积之和以10为模,10与模值的差值再对10取模(即取个位的数字)即可得到校验位的值,其值范围应该为0~9。
下⾯的程序实现了该算法,请仔细阅读源码,填写缺失的部分。
————————————————
题解:
把握好题意的上半部分即可,即通过遍历将字符串的每⼀位都专门的选择出来,然后判断其是否为有
效的字符,然后再判断这⼀位是奇数位还是偶数位,然后分别叫进⾏不同的操作即可,后⾯的内容对解答此题是⽆所谓的。
需要注意的是不能直接c*3,要先通过隐式转换变成整型才可,即减去⼀个‘0’。
// 验证成功返回1,否则返回0
int f(const char* s)
{
int k=1;
int sum =0;
int i;
for(i=0; s[i]!='\0'; i++){
char c = s[i];
if(c=='-'|| c==' ')continue;
sum +=k%2==1?(c-'0')*3:(c-'0');//填空位置
k++;
if(k>12)break;
}
while(s[i]!='\0') i++;
return(s[i-1]-'0')==(10-sum %10)%10;
}
int main()
{
printf("%d\n",f("978-7-301-04815-3"));
printf("%d\n",f("978-7-115-38821-6"));
return0;
}
次数差
题⽬描述 x星球有26只球队,分别⽤a~z的26个字母代表。他们总是不停地⽐赛。 在某⼀赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成⼀个长长的串。 国王总是询问:获胜次数最多的和获胜次数最少的有多⼤差距?(当然,他不关⼼那些⼀次也没获胜的,认为他们在怠⼯罢了)
输⼊,⼀个串,表⽰球队获胜情况(保证串的长度<1000)
要求输出⼀个数字,表⽰出现次数最多的字母⽐出现次数最少的字母多了多少次。
⽐如: 输⼊: abaabcaa
则程序应该输出: 4
解释:a出现5次,最多;c出现1次,最少。5-1=4
再⽐如: 输⼊: bbccccddaaaacccc
程序应该输出: 6
资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗 < 1000ms
题⽬分析
本题可以直接使⽤哈希表存储每次出现的字母,接着对这个哈希表进⾏遍历,如果此时遍历到的哈希表的某⼀序列其存储值不为0,即为有效哈希表,然后对有效哈希表进⾏选择,选出出现最多的和出现最少的字母,即对应哈希表中存储数最⼤的和数最⼩的即可,然后做差得到答案。
题⽬代码
————————————————
#include<stdio.h>
#include<string.h>
#include<limits.h>
int main()
{
char zfc[1000];
scanf("%s",zfc);
int n =strlen(zfc);
int hash[26]={0};
for(int i=0;i<n;i++)
{
hash[zfc[i]-'a']++;
}
int max = hash[0];
int min=INT_MAX;
for(int i=0;i<26;i++)
{
if(hash[i]>max)
{
max = hash[i];
}
if(hash[i]<min&&hash[i]!=0)
{
min = hash[i];
}
}
printf("%d-%d = %d",max,min,max-min);
}
耐摔指数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。