蓝桥杯B组30多分进国赛了,觉得有的玩,再刷一刷算法把
B组的题目笔记
(16条消息) 蓝桥杯2023年第十四届c++B组省赛真题_尘_客的博客-CSDN博客
编程题目链接放下边,就不放题干了
2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组真题 - 题库 - C语言网 (dotcpp.com)
幸运数
暴力的选择题运行时候让他运行就行了,等几分钟都行
答案 4430091
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
int dp[5005][5005];
int main()
{
int res=0;
for(int k=1;k<=100000000;k++)
{
int num=k;
vector<int>temp;
while(num)
{
temp.push_back(num%10);
num/=10;
}
if(temp.size()%2==0)
{
long long sum=0;
for(int i=0;i<temp.size()/2;i++)
{
sum+=temp[i];
}
for(int i=temp.size()/2;i<temp.size();i++)
{
sum-=temp[i];
if(sum<0)break;
}
if(sum==0)res++;
}
}
cout<<res;
return 0;
}
有奖问答
8335366
深搜
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
int cnt;
void dfs(int i,int score)
{//做到第i题
if(score==70)cnt++;
if(i>=30)return ;
if(score>=100)return ;
dfs(i+1,score+10);//此题正确
dfs(i+1,0);//此题错误
}
int dp[50][150];
int main()
{
dfs(0,0);
cout<<cnt;
return 0;
}
下面这段dp不对,答案差1,看出错误的朋友d一下
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
int dp[50][150];
int main()
{
/*dp[i][j]为做了[0,i]这几道题分数为j的数目
dp[i][j]=dp[i-1][j-10]+dp[i-1][0]
*/
int ans=0;
for(int i=0;i<10;i++)dp[i][0]=1;
for(int i=1;i<30;++i)
{
for(int j=0;j<100;j+=10)
{
if(j>=10)
dp[i][j]+=dp[i-1][j-10];
dp[i][0]+=dp[i-1][j];
}
ans+=dp[i][70];
}
for(int i=0;i<30;i++)
{
for(int j=0;j<=100;j+=10)
cout<<dp[i][j]<<" ";
cout<<endl;
}
cout<<ans;
return 0;
}
正确的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[31][101],ans;
int main(){
dp[0][0]=1;
for(int i=0;i<30;++i){
for(int j=0;j<100;j+=10){
if(!dp[i][j])continue;
if(j<90)dp[i+1][j+10]+=dp[i][j];
dp[i+1][0]+=dp[i][j];
}
ans+=dp[i+1][70];
}
printf("%lld\n",ans);
for(int i=0;i<30;i++)
{
for(int j=0;j<=100;j+=10)
cout<<dp[i][j]<<" ";
cout<<endl;
}
return 0;
}
平方差
找规律:奇数或四的倍数都可以
学到一个找区间内k的倍数个数[l,r]
k倍数
个数=r/k - (l-1)/k;
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
int main()
{
//找规律:奇数或四的倍数都可以
int l,r;
cin>>l>>r;
/*找l->R奇数+4的倍数
ans=(r-l+1)- (偶数个数-4的倍数个数)
偶数个数 =r/2 -(l-1)/2
1->r偶数 - 1->l偶数 (别减去左边界l,所以是l-1)
4的倍数个数=r/4 -(l-1)/4
*/
cout<<(r-l+1)-(r/2-(l-1)/2)+(r/4-(l-1)/4);
/*
for(int k=l;k<=r;k++)
{//O(n)遍历 不能AC
if(k%2||k%4==0)res++;
}
*/
return 0;
}
更小的数
上dp,和力口这个题很想
那么此时此刻——恰如彼时彼刻——竟能如此相像—— 像!
647. 回文子串 - 力扣(Leetcode)
dp[i][j]是判断翻转[i,j]是否符合条件
递推公式
if(s[i]>s[j])dp[i][j]=1 (6xxx1)开头就能判断
else if(s[i]<s[j]) (1xxx9)肯定没戏
else dp[i][j]=dp[i+1][j-1] 开头相等由内部决定
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
int dp[5005][5005];
int main()
{
string s;
cin>>s;
int n=s.size();
/*dp[i][j]是判断翻转[i,j]是否符合条件
递推公式
if(s[i]>s[j])dp[i][j]=1 (6xxx1)开头就能判断
else if(s[i]<s[j]) (1xxx9)肯定没戏
else dp[i][j]=dp[i+1][j-1] 开头相等由内部决定
*/
int res=0;
for(int i=n-1;i>=0;i--)
{//由递推公式决定的递推顺序
for(int j=i+1;j<n;j++)
{
if(s[i]>s[j])dp[i][j]=1 ;
else if(s[i]<s[j])dp[i][j]=0;
else dp[i][j]=dp[i+1][j-1];
if(dp[i][j])res++;//记录
}
}
cout<<res;
return 0;
}
后面题还不适合我这个蒻季做,参考大佬的文章来源:https://www.toymoban.com/news/detail-523486.html
(44条消息) 2023第十四届蓝桥杯 C/C++大学生A组省赛 满分题解_Code92007的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-523486.html
到了这里,关于2023十四届蓝桥杯C++A组真题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!