点击跳转例题
[蓝桥杯 2023 省 A] 填空问题 - 洛谷
一。
思路:直接暴力枚举即可,因为可以在本地跑,没有限时:答案为:4430091#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f; int a[N],b[N],c[N],pre[N]; bool check(int x) { string s=to_string(x); if(s.size()&1)return false; int sum1=0,sum2=0; for(int i=0;i<s.size();i++) { if(i<s.size()/2) { sum1+=s[i]-'0'; } else sum2+=s[i]-'0'; } return sum1==sum2; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int ans=0; for(int i=1;i<=1e8;i++) if(check(i)) ans++; cout<<ans<<endl; return 0; }
二。
思路:答案为:8335366
1.f(i,j)表示前 i 题得分为 j 的方案。
2.状态转移方程,分答对了和答错了。
3.初始化,根据定义 f(0,0)=1
4.递推。
代码:简单动态规划:#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f; int f[40][110]; signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); //前i题总分为j的情况。 f[0][0]=1; for(int i=1;i<=30;i++) for(int j=0;j<=100;j+=10) { //if对 if(j<90) f[i][j+10]+=f[i-1][j]; //else f[i][0]+=f[i-1][j]; } int ans=0; //答案为8335366 //for(int i=1;i<=30;i++) //ans+=f[i][70]; //答案为:4165637 ans+=f[30][70]; cout<<ans<<endl; return 0; }
dfs搜索:
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' using namespace std; const int N=2e5+10,M=1e3+10; int a[N],pre[N]; int ans=0; void dfs(int score,int cnt) { if(cnt>30||score==100) return; //加判断cnt==30,答案为:4165637,不加为:8335366 if(score==70&&cnt==30) ans++; dfs(score+10,cnt+1); dfs(0,cnt+1); } signed main() { std::ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); dfs(0,0); cout<<ans<<endl; return 0; }
洛谷的答案为:
#include<stdio.h> int main(void) { char c = getchar(); if(c == 'A') printf("4430091"); else printf("4165637"); return 0; }
P9230 [蓝桥杯 2023 省 A] 填空问题--2024蓝桥杯冲刺省一
于 2024-02-13 14:41:38 首次发布