赞
踩
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,和力口这个题很想
那么此时此刻——恰如彼时彼刻——竟能如此相像—— 像!
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;
- }
后面题还不适合我这个蒻季做,参考大佬的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。