==============================
2019-2021蓝桥杯C++ C组真题题解:
2019第十届蓝桥杯大赛软件类省赛C++ C组真题题解
2020第十一届蓝桥杯大赛软件类省赛第二场C++ C组真题题解
2021第十二届蓝桥杯大赛软件赛省赛C++ C组真题题解
==============================
题目分析:
枚举
题目代码:
#include
using namespace std;
int main()
{
int tot=0;
for(int i=1;i<=78120;i++)
{
if(78120%i==0)tot++;
}
cout<<tot<<endl;
return 0;
}
题目答案:
96
题目分析:
这道题直接暴力求解就行了
题目代码:
#include
using namespace std;
long long res=0;
void cal(int n)
{
while(n!=0)
{
if(n%10==2)res++;
n/=10;
}
}
int main()
{
for(int i=1;i<=2020;i++)
{
cal(i);
}
cout<<res<<endl;
return 0;
}
题目答案:
624
题目分析:
枚举从开始到结束的每一天,注意下面即可
1.检查是否是闰年
2.检查是否是星期一
3.检查是否是开始月初
题目代码:
#include
using namespace std;
int months[]={31,28,31,30,31,30,31,31,30,31,30,31};
bool isrun(int a)//是否是闰年
{
return (a%4==0&&a%100!=0)||(a%400==0);
}
int main()
{
int day=5;//因为第一天是星期六,所以前一天是星期五
long long res=0;
for(int year=2000;year<2020;year++)//枚举年份
{
for(int month=0;month<12;month++)//枚举每月
{
int monthnum=months[month];
if(isrun(year)&&month==1)monthnum=29;//如果是闰年则二月是29天
for(int i=0;i<monthnum;i++)//枚举每一天
{
day++;
day=day%7;
if(day==1||i==0)res+=2;//如果是月初或者是星期一
else res+=1;
}
}
}
for(int month=0;month<9;month++)//枚举2020年 到10月1号
{
int monthnum=months[month];
if(month==1)monthnum=29;
for(int i=0;i<monthnum;i++)
{
day++;
day=day%7;
if(day==1||i==0)res+=2;
else res+=1;
}
}
res+=2;
day++;
cout<<res<<endl;
cout<<day<<endl;
return 0;
}
题目答案:
8879
题目分析:
不会,只能去寻找大佬的博客
第十一届蓝桥杯A组省赛平面分割
题目代码:
题目答案:
1391
题目分析:
从图中我们可以知道
我们将斜着的作为一排,第n排坐标之和为n+1,第i排的数字个数为i
所以20行20列坐标之和为40,则是第39排,前面数字是1加到38然后再加20即可
题目代码:
#include
using namespace std;
int main()
{
int res=0;
for(int i=1;i<=38;i++)res+=i;
cout<<res+20<<endl;
return 0;
}
题目答案:
761
题目分析:
难点:最后一位要进行四舍五入,因为int是直接把最后一位抹掉
方法:因为计算时会变成小数,但是答案百分位是两位数,所以要多乘100。
我们可以再多乘一位,观察最后一位(也就是舍弃的那位)如果大于等于5则将舍弃前一位加1
题目代码:
#include
using namespace std;
int main()
{
int n,score;
cin>>n;
int p_jige=0,p_you=0;
for(int i=0;i<n;i++)
{
cin>>score;
if(score>=85)p_you++;
if(score>=60)p_jige++;
}
int f_jige=(p_jige*1.0/n)*1000;//多乘一位 方便四舍五入
int f_you=(p_you*1.0/n)*1000;
if(f_jige%10>=5)f_jige+=10;//如果最后一位大于等于五 则加1
if(f_you%10>=5)f_you+=10;
cout<<f_jige/10<<"%"<<endl;//将最后一位舍掉
cout<<f_you/10<<"%"<<endl;
}
题目分析:
我们可以用数组保存字母出现的个数
char类型其实也是int类型(1+‘a’=‘b’)
题目代码:
#include
using namespace std;
int word[26];//保存每个字母出现个数
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
word[s[i]-'a']++;
}
char res=' ';
int n=0;
for(int i=0;i<26;i++)//查找最大的字母及其个数
{
if(word[i]>n)
{
n=word[i];
res='a'+i;
}
}
cout<<res<<endl;
cout<<n<<endl;
return 0;
}
题目分析:
这道题是根据数字三角形改编的,但是加了一个条件向左下走和右下走的次数相差不为1,这代表走到的终点只能为中间的数(如果是奇数则是中间的一个,如果是偶数则是中间的两个)
则在没有限制的基础上,加上限制即可
题目代码:
#include
using namespace std;
int num[105][105];
int dp[105];
int main()
{
int N;
cin>>N;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=i;j++)
{
cin>>num[i][j];
}
}
if(N%2==0)
{
dp[N/2]=num[N][N/2];
dp[N/2+1]=num[N][N/2+1];
}else{
dp[N/2+1]=num[N][N/2+1];
}
for(int i=N-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
if(dp[j]==0&&dp[j+1]==0)continue;
dp[j]=max(dp[j],dp[j+1])+num[i][j];
}
}
cout<<dp[1]<<endl;
return 0;
}
题目分析:
题目代码:
题目答案:
题目分析:
具体分析我单独写了一个博客
https://blog.csdn.net/qq_46470984/article/details/123652295?spm=1001.2014.3001.5501
题目代码:
#include
using namespace std;
int pre[26];
int main()
{
string s;
cin>>s;
long long total=0;
memset(pre,-1,sizeof(pre));
for(int i=0;i<s.size();i++)
{
total+=(i-pre[s[i]-'a'])*(s.size()-i);
pre[s[i]-'a']=i;
}
cout<<total;
return 0;
}