当前位置:   article > 正文

蓝桥杯刷题计划-洛谷-持续更新

蓝桥杯刷题计划-洛谷-持续更新

P8598 [蓝桥杯 2013 省 AB] 错误票据

题目

  1. #include <bits/stdc++.h>
  2. #define endl '\n'
  3. #define int long long
  4. #define INF 0x3f3f3f3f3f
  5. const int N = 1000010;
  6. using namespace std;
  7. int arr[N];
  8. signed main()
  9. {
  10. int N;
  11. cin>>N;
  12. int idx;
  13. while(cin>>arr[++idx]){}
  14. //排序
  15. sort(arr+1,arr+idx+1);
  16. int ans1,ans2;
  17. for(int i = 1; i <= idx; i++){
  18. if(arr[i+1] - arr[i] == 2)
  19. ans1 = arr[i]+1;
  20. if(arr[i+1] == arr[i])
  21. ans2 = arr[i];
  22. }
  23. cout<<ans1<<' '<<ans2;
  24. return 0;
  25. }

P8752 [蓝桥杯 2021 省 B2] 特殊年份

题目

  1. #include<bits/stdc++.h>
  2. #define ll longlong
  3. using namespace std;
  4. int a[100010];
  5. int main(){
  6. int n = 5;
  7. string s;
  8. int ans = 0;
  9. for(int i = 0; i < n;i++ ){
  10. cin>>s;
  11. if(s[0] == s[2]&& s[3] - s[1] == 1)
  12. ans++;
  13. }
  14. cout<<ans;
  15. return 0;
  16. }

P8753 [蓝桥杯 2021 省 AB2] 小平方

题目

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. signed main()
  8. {
  9. ios::sync_with_stdio(0);
  10. cin.tie(0);
  11. cout.tie(0);
  12. int n;
  13. cin>>n;
  14. int cnt= 0 ;
  15. for(int i = 1; i<= n-1; i++){
  16. int x = i*i;
  17. if((x % n) < n/2.0){
  18. cnt++;
  19. }
  20. }
  21. cout<<cnt;
  22. return 0;
  23. }

P8780 [蓝桥杯 2022 省 B] 刷题统计

题目

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. signed main()
  8. {
  9. ios::sync_with_stdio(0);
  10. cin.tie(0);
  11. cout.tie(0);
  12. int a,b,n;
  13. cin>>a>>b>>n;
  14. int sum = 0;
  15. int cnt = 1;
  16. while(sum<n){
  17. if(cnt % 7>=1&& cnt%7<=5)
  18. sum+=a;
  19. else
  20. sum+=b;
  21. cnt++;
  22. }
  23. cout<<cnt-1;
  24. return 0;
  25. }

P8706 [蓝桥杯 2020 省 AB1] 解码

题目

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. signed main()
  8. {
  9. ios::sync_with_stdio(0);
  10. cin.tie(0);
  11. cout.tie(0);
  12. string s;
  13. cin>>s;
  14. for(int i = 0;i < s.size();i++){
  15. if(s[i]>='1'&& s[i]<='9')
  16. for(int j = 0 ; j < s[i]-'1';j++)
  17. cout<<s[i-1];
  18. else
  19. cout<<s[i];
  20. }
  21. return 0;
  22. }

P8717 [蓝桥杯 2020 省 AB2] 成绩分析

题目

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. signed main()
  8. {
  9. ios::sync_with_stdio(0);
  10. cin.tie(0);
  11. cout.tie(0);
  12. int n;
  13. int a[N];
  14. cin>>n;
  15. for(int i = 0 ;i < n;i++){
  16. cin>>a[i];
  17. }
  18. sort(a,a+n);
  19. double sum = 0;
  20. for(int i = 0 ; i < n;i++)
  21. sum+= a[i];
  22. double ans = sum/n*1.0;
  23. cout<<a[n-1]<<endl<<a[0]<<endl;
  24. printf("%.2lf",ans);
  25. return 0;
  26. }

P8711 [蓝桥杯 2020 省 B1] 整除序列

题目

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. signed main()
  8. {
  9. ios::sync_with_stdio(0);
  10. cin.tie(0);
  11. cout.tie(0);
  12. int n ;
  13. cin>>n;
  14. while(n>0){
  15. cout<<n<<" ";
  16. n = n>>1;
  17. }
  18. return 0;
  19. }

P8722 [蓝桥杯 2020 省 AB3] 日期识别

题目

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. unordered_map<string,int> mp{//创立哈希表,建立字符到整形的映射
  7. {"Jan",1},
  8. {"Feb",2},
  9. {"Mar",3},
  10. {"Apr",4},
  11. {"May",5},
  12. {"Jun",6},
  13. {"Jul",7},
  14. {"Aug",8},
  15. {"Sep",9},
  16. {"Oct",10},
  17. {"Nov",11},
  18. {"Dec",12}
  19. };
  20. const int N = 100010;
  21. signed main()
  22. {
  23. ios::sync_with_stdio(0);
  24. cin.tie(0);
  25. cout.tie(0);
  26. string s;
  27. cin>>s;
  28. string s1 = s.substr(0,3);
  29. string s2 = s.substr(3);
  30. cout<<mp[s1]<<" ";
  31. if(s2[0] != '0')
  32. cout<<s2[0];
  33. cout<<s2[1];
  34. return 0;
  35. }

P8680 [蓝桥杯 2019 省 B] 特别数的和

题目

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. signed main()
  8. {
  9. ios::sync_with_stdio(0);
  10. cin.tie(0);
  11. cout.tie(0);
  12. int n;
  13. int ans = 0;
  14. cin>>n;
  15. for(int i = 1;i<=n;i++){
  16. string s = to_string(i);
  17. for(int j =0; j <s.size();j++){
  18. if(s[j] == '0' || s[j] =='1'||s[j] =='2'||s[j] == '9')
  19. { ans+=i;
  20. break;
  21. }
  22. }
  23. }
  24. cout<<ans;
  25. return 0;
  26. }

P9240 [蓝桥杯 2023 省 B] 冶炼金属

题目

  • 思路 贪心
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. signed main()
  8. {
  9. ios::sync_with_stdio(0);
  10. cin.tie(0);
  11. cout.tie(0);
  12. int n;
  13. cin>>n;
  14. int a,b;
  15. int ans_min = 0,ans_max = 1e9;
  16. for(int i= 0; i< n;i++){
  17. cin>>a>>b;
  18. ans_min = max(ans_min,a/(b+1)+1);
  19. ans_max = min(ans_max,a/b);
  20. }
  21. cout<<ans_min<<" "<<ans_max;
  22. return 0;
  23. }

P8597 [蓝桥杯 2013 省 B] 翻硬币

题目

  • 思路 模拟
  • 遇到不同的就反转
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. int arr[N];
  8. signed main(){
  9. string a,b;
  10. cin>>a>>b;
  11. int cnt = 0;
  12. for(int i = 0 ; i < a.size();i++){
  13. if(a[i]!=b[i]){
  14. a[i] = a[i] == 'o'?'*':'o';
  15. a[i+1] = a[i+1] =='o'?'*':'o';
  16. cnt++;
  17. }
  18. }
  19. cout<<cnt;
  20. return 0;
  21. }

P8647 [蓝桥杯 2017 省 AB] 分巧克力

  • 思路 打暴力超时 题干字眼——输出切出的正方形巧克力最大可能的边长 二分答案
  • 对于第 i 块巧克力,当边长为 x 时,可以分出 ⌊(ai÷x)×(bi÷x)⌋ 块巧克力。

题目

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. int a[N],b[N];//长宽
  8. int n,k;
  9. bool check(int mid){
  10. int cnt =0 ;
  11. for(int i = 1 ; i <= n ;i++){
  12. cnt+=(a[i]/mid)*(b[i]/mid);
  13. }
  14. if(cnt>=k)return true;
  15. else return false;
  16. }
  17. signed main(){
  18. std::ios::sync_with_stdio(false);
  19. cin.tie(0);
  20. cout.tie(0);
  21. cin>>n>>k;
  22. for(int i = 1; i <= n;i++){
  23. cin>>a[i]>>b[i];
  24. }
  25. int l = 0;
  26. int r = 10010;
  27. while(l+1<r){
  28. int mid = (l+r)>>1;
  29. if(check(mid))
  30. l = mid;
  31. else
  32. r = mid;
  33. }
  34. if(check(r)) cout<<r;
  35. else cout<<l;
  36. return 0;
  37. }

P8772 [蓝桥杯 2022 省 A] 求和

题目

  • 思路 前缀和 注意数据范围!
  • S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+⋯+an−2⋅an−1+an−2⋅an+an−1⋅an

=(a2+a3+⋯+an)⋅a1+(a3+a4+⋯+an)⋅a2+⋯+anan−1

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f3f
  5. using namespace std;
  6. const int N = 200010;
  7. int arr[N],sum[N];
  8. int n;
  9. int ans;
  10. signed main(){
  11. std::ios::sync_with_stdio(false);
  12. cin.tie(0);
  13. cout.tie(0);
  14. cin>>n;
  15. for(int i = 1 ; i<=n;i++){
  16. cin>>arr[i];
  17. sum[i] = sum[i-1] + arr[i];
  18. }
  19. for(int i =1 ;i <=n-1 ;i++){
  20. ans += arr[i]*(sum[n]-sum[i]);
  21. }
  22. cout<<ans;
  23. return 0;
  24. }

P8665 [蓝桥杯 2018 省 A] 航班时间

题目

  • 前置知识
    • 去程时间 =飞行时间 + 时差;回程时间 = 飞行时间 − 时差
    • 由此可知 飞行时间 = (去+回)/ 2
  1. 用 scanf 输入前面的时间:
scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
  1. 每一行后面不一定有额外的天数。如果有,则中间一定有空格,所以判断下一个字符是否为空格即可。
  2. 为方便计算,不妨把时间都转换成以秒为单位 t=86400⋅d+3600⋅h+60⋅m+s
  3. h = ans/3600 min = ans%3600/60 s = ans%60
  1. #include <bits/stdc++.h>
  2. #define endl '\n'
  3. #define INF 0x3f3f3f3f3f
  4. const int N = 1000010;
  5. using namespace std;
  6. int get()
  7. {
  8. int h1,m1,s1,h2,m2,s2,day=0;
  9. scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
  10. if(getchar()==' ')scanf("(+%d)",&day);
  11. return (day*86400+h2*3600+m2*60+s2)-(h1*3600+m1*60+s1);
  12. }
  13. signed main()
  14. {
  15. int T;
  16. scanf("%d",&T);
  17. while(T--)
  18. {
  19. int ans=(get()+get())/2;
  20. printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%60);
  21. }
  22. return 0;
  23. }

P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值

题目

  • 思路 模拟
  • 完全二叉树的性质

设深度为 dep根节点的深度为 1。则有第 dep 层的节点为 2dep,每层开头的节点编号为 2dep−1,末尾的节点编号为 2dep−1(以上结论叶子节点除外)。

  • 注意上面加粗黑体字 第一次没考虑到 错了两个点 叶子节点需要额外特判
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. int arr[N];
  8. int n;
  9. int dep = 1,sum = 0,Max = -1,a,ans;
  10. signed main(){
  11. std::ios::sync_with_stdio(false);
  12. cin.tie(0);
  13. cout.tie(0);
  14. cin>>n;
  15. for(int i = 1; i <= n; i++){
  16. cin>>a;
  17. sum+=a;
  18. if(i == (1<<dep)-1){//判断当前位置是否是该dep的最后一个节点?结算:go on
  19. if(sum>Max){
  20. Max = sum;
  21. ans = dep;
  22. }
  23. dep++;
  24. sum = 0;
  25. }
  26. }
  27. if(sum>Max){//叶子节点特判
  28. Max = sum;
  29. ans = dep;
  30. }
  31. cout<<ans;
  32. return 0;
  33. }

P9231 [蓝桥杯 2023 省 A] 平方差

题目

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. int arr[N];
  8. int n;
  9. int f(int x) {//小于等于x的奇数个数
  10. if (!x) return 0;
  11. return (x + 1) / 2;
  12. }
  13. int g(int x) {//小于等于x的4的倍数个数
  14. return x / 4;
  15. }
  16. signed main(){
  17. std::ios::sync_with_stdio(false);
  18. cin.tie(0);
  19. cout.tie(0);
  20. int l, r; cin >> l >> r;
  21. cout << f(r) - f(l - 1) + g(r) - g(l - 1);
  22. return 0;
  23. }

P9230 [蓝桥杯 2023 省 A] 填空问题

题目

  • 思路
  • problem A 填空题 本地暴力枚举
  • 把数字转成字符串去处理
  • 答案为 4430091
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 1e8;
  7. bool check(string s){
  8. int ans1 = 0 ,ans2 = 0;
  9. for(int i = 0; i < s.size();i++){
  10. if(i<s.size()/2)
  11. ans1 += s[i]-'0';
  12. else
  13. ans2 += s[i]-'0';
  14. }
  15. return ans1 == ans2;
  16. }
  17. signed main(){
  18. std::ios::sync_with_stdio(false);
  19. cin.tie(0);
  20. cout.tie(0);
  21. string s;
  22. int ans = 0;
  23. for(int i = 1 ; i<= N;i++){
  24. s= to_string(i);
  25. if(s.size()%2 == 1)continue;//奇数
  26. if(check(s)) {
  27. ans++;
  28. }
  29. }
  30. cout<<ans;
  31. return 0;
  32. }
  • problem B DFS 本地暴搜
  • 答案为 4165637
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 1e8;
  7. int arr[N];
  8. int ans;
  9. void dfs(int score,int cnt){
  10. if(cnt>30||score == 100)
  11. return;
  12. if(cnt == 30 && score == 70)
  13. ans++;
  14. dfs(score+10,cnt+1);
  15. dfs(0,cnt+1);
  16. }
  17. signed main(){
  18. std::ios::sync_with_stdio(false);
  19. cin.tie(0);
  20. cout.tie(0);
  21. //表示0分 0题
  22. dfs(0,0);
  23. cout<<ans;
  24. return 0;
  25. }

P8649 [蓝桥杯 2017 省 B] k 倍区间

题目

题解参考

  • 思路 看到”连续子序列求和”这一要求时,我们果断选择前缀和解答
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. int arr[N],sum[N];
  8. int n,k;
  9. map<int,int> mp;
  10. signed main(){
  11. std::ios::sync_with_stdio(false);
  12. cin.tie(0);
  13. cout.tie(0);
  14. cin>>n>>k;
  15. int ans = 0;
  16. mp[0] = 1;
  17. for(int i = 1; i<=n;i++){
  18. cin>>arr[i];
  19. sum[i] = (sum[i-1]+ arr[i])%k;//记录前缀和模k的值
  20. mp[sum[i]]++;
  21. }
  22. for(int i = 0; i< n;i++){
  23. ans+=(mp[i]*(mp[i]-1))/2;
  24. }
  25. cout<<ans;
  26. return 0;
  27. }
  • 自己的理解
  • 解释:1要和其他1组一起 满足

                0可以单独算也可以组在一起 满足

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int N = 100010;
  7. int arr[N],sum[N];
  8. int n,k;
  9. map<int,int> mp;
  10. signed main(){
  11. std::ios::sync_with_stdio(false);
  12. cin.tie(0);
  13. cout.tie(0);
  14. cin>>n>>k;
  15. int ans = 0;
  16. for(int i = 1; i<=n;i++){
  17. cin>>arr[i];
  18. sum[i] = (sum[i-1]+ arr[i])%k;//记录前缀和模k的值
  19. mp[sum[i]]++;
  20. }
  21. for(auto i :mp){
  22. if(i.first == 0)
  23. ans+=i.second*(i.second+1)/2;
  24. else
  25. ans+=i.second*(i.second-1)/2;
  26. }
  27. cout<<ans;
  28. return 0;
  29. }

P8623 [蓝桥杯 2015 省 B] 移动距离

题目

  • 思路 纯模拟
  • 重点在于算出两个建筑物的坐标,及需要算出两个建筑物分别的 xy 坐标。
  • 根据样例 不难看出 奇数行和偶数行的情况分别相同
  • 为了方便,我们把 1 2 3 4 5 6 这一行称作第 0 行,
  • 预处理 将编号全部减一 少做一个特判 爽 即(1 2 3 4 5 6 )->(0 1 2 3 4 5)
  • 这样一来,显然可以得出对于奇数行第 k 个点的坐标是:

而偶数行为(把奇数行的横坐标倒换):

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define INF 0x3f3f3f3f
  4. #define end '\n'
  5. const int N = 10010;
  6. using namespace std;
  7. signed main(){
  8. std::ios::sync_with_stdio(false);
  9. cin.tie(0);
  10. cout.tie(0);
  11. int w,m,n;
  12. cin>>w>>m>>n;
  13. m--;//预处理
  14. n--;
  15. int x1 = m%w, y1 = m/w,x2 = n%w,y2 = n/w;
  16. if(y1%2 == 1){//判断奇偶层数
  17. x1 = w-1-x1;
  18. }
  19. if(y2%2 == 1){
  20. x2 = w-1-x2;
  21. }
  22. cout<<abs(x2-x1) + abs(y2-y1)<<endl;//绝对值防止n比m大
  23. return 0;
  24. }

P8682 [蓝桥杯 2019 省 B] 等差数列

题目

  • 思路 求公差
  • 这就意味着我们已经知道了最终等差数列的首项和末项,所以我们只需求出公差即可。
  • 为了使项数最少,我们需要公差尽可能地大。
  • 所以任意两项的差均为公差 d 的倍数,于是所求 d 为所有相邻两项差的公约数。又因为 d 要最大,所以 d 就是所有相邻两项差的最大公约数。
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define INF 0x3f3f3f3f
  4. #define end '\n'
  5. const int N = 100010;
  6. using namespace std;
  7. int arr[N];
  8. int gcd(int x,int y){
  9. if(y == 0)
  10. return x;
  11. return gcd(y, x % y);
  12. }
  13. signed main(){
  14. std::ios::sync_with_stdio(false);
  15. cin.tie(0);
  16. cout.tie(0);
  17. int n;
  18. cin>>n;
  19. for(int i = 1; i <= n ;i++){
  20. cin>>arr[i];
  21. }
  22. sort(arr+1,arr+n+1);//排序
  23. if(arr[1]==arr[n]){//加特判 d为0
  24. cout<<n;
  25. return 0;
  26. }
  27. int d = arr[2]-arr[1];
  28. for(int i = 2 ; i <= n;i++){
  29. d = gcd(d,arr[i]-arr[i-1]);
  30. }
  31. cout<<(arr[n]-arr[1])/d+1<<endl;//求项数
  32. return 0;
  33. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/385359
推荐阅读
相关标签
  

闽ICP备14008679号