当前位置:   article > 正文

蓝桥杯刷题第十三天_对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的

对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的

第一题:特殊日期

问题描述
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 11 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
例如,2022 年 11 月 13 日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
请提交满足条件的日期的总数量。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
运行限制
最大运行时间:1s
最大运行内存: 256M

暴力枚举,加判断

判断日期合法,以及满足条件

  1. #include<iostream>
  2. using namespace std;
  3. bool isleap(int year){
  4. return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
  5. }
  6. bool check(int x){
  7. int year = x / 10000;
  8. int month = x / 100 % 100;
  9. int day = x % 100;
  10. if(day < 1 || day > 31 || month < 1 || month > 12) return false;
  11. if(month == 2)
  12. if(isleap(year) && day > 29) return false;
  13. else if(!isleap(year) && day > 28) return false;
  14. if(month == 4 || month == 6 || month == 9 || month == 11)
  15. if(day > 30) return false;
  16. return true;
  17. }
  18. int main(){
  19. int ans = 0;
  20. for(int i = 19000101; i <= 99991231; i++){
  21. int a = i / 10000000;
  22. int b = i / 1000000 % 10;
  23. int c = i / 100000 % 10;
  24. int d = i / 10000 % 10;
  25. int e = i / 1000 % 10;
  26. int f = i / 100 % 10;
  27. int g = i / 10 % 10;
  28. int h = i % 10;
  29. if(a + b + c + d == e + f + g + h && check(i))
  30. ans++;
  31. }
  32. cout<<ans<<endl;
  33. return 0;
  34. }

第二题:重合次数

问题描述
在同一天中, 从上午 6 点 13 分 22 秒到下午 14 点 36 分 20 秒, 钟表上的 分针和秒针一共重合了多少次?
注意时针、分针、秒针都围绕中心敳匀速运动。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
运行限制
最大运行时间:1s
最大运行内存: 512M

规律,每过一分钟一次重合

47 + 59 * 7 + 34

第三题:左移右移

问题描述
小蓝有一个长度为 N 的数组, 初始时从左到右依次是 1,2,3,…N
之后小蓝对这个数组进行了 M 次操作, 每次操作可能是以下 2 种之一:
左移 x, 即把 x 移动到最左边。
右移 x, 即把 x 移动到最右边。
请你回答经过 M 次操作之后, 数组从左到右每个数是多少?
输入格式
第一行包含 2 个整数, NM
以下 M 行每行一个操作, 其中 “L x "表示左移 ,"Rx "表示右移 x
输出格式
输出 N 个数, 代表操作后的数组。
样例说明
样例中的数组变化如下:
[1,2,3,4,5]→[3,1,2,4,5]→[2,3,1,4,5]→[2,3,4,5,1]
评测用例规模与约定
对于 50%50% 的评测用例, 1≤N,M≤10000.
对于 100%100% 的评测用例, 1≤N,M≤200000,1≤xN.

样例输入

  1. 5 3
  2. L 3
  3. L 2
  4. R 1

样例输出

2 3 4 5 1

每个位置都有对应的权重

往左边移动权重变为最小,往右边移动权重最大

再排序权重,即得到序列

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef pair<int, int> PII;
  5. const int N = 200010;
  6. int n, m;
  7. PII a[N];
  8. bool cmp(PII a, PII b){
  9. return a.second < b.second;
  10. }
  11. int main(){
  12. scanf("%d%d", &n, &m);
  13. for(int i = 1; i <= n; i++){
  14. a[i].first = i;
  15. a[i].second = i;
  16. }
  17. int cnt1 = -3e6 + 1, cnt2 = 3e6 + 1;
  18. while(m--){
  19. string op; int x;
  20. cin>>op; cin>>x;
  21. if(op == "L") a[x].second = cnt1--;
  22. else a[x].second = cnt2++;
  23. }
  24. sort(a + 1, a + 1 + n, cmp);
  25. for(int i = 1; i <= n; i++)
  26. cout<<a[i].first<<" ";
  27. return 0;
  28. }

第四题:近似gcd

题目链接:近似gcd - 蓝桥云课 (lanqiao.cn)

还得是梗佬,厉害厉害

参考佬代码写的

  1. #include<iostream>
  2. using namespace std;
  3. typedef long long LL;
  4. int n, g, a[100010];
  5. int main(){
  6. scanf("%d%d", &n, &g);
  7. for (int i = 1; i <= n; ++i) {
  8. int x;
  9. cin >> x;
  10. a[i] = (x % g == 0);
  11. a[i] += a[i - 1];
  12. }
  13. int l = 0;
  14. LL ans = 0;
  15. for (int r = 2; r <= n; ++r) {
  16. while (l + 1 < r && a[r] - a[l] < r - l - 1) l++;
  17. ans += r - l -1;
  18. }
  19. cout << ans << endl;
  20. return 0;
  21. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/794804
推荐阅读
相关标签
  

闽ICP备14008679号