蓝桥杯刷题第十三天

第一题:特殊日期

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

暴力枚举,加判断

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

#include<iostream>
using namespace std;

bool isleap(int year){
  return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}

bool check(int x){
  int year = x / 10000;
  int month = x / 100 % 100;
  int day = x % 100;
  if(day < 1 || day > 31 || month < 1 || month > 12) return false;
  if(month == 2)
    if(isleap(year) && day > 29) return false;
    else if(!isleap(year) && day > 28) return false;
  if(month == 4 || month == 6 || month == 9 || month == 11)
    if(day > 30) return false;
  return true;
}

int main(){
  int ans = 0;

  for(int i = 19000101; i <= 99991231; i++){
    int a = i / 10000000;
    int b = i / 1000000 % 10;
    int c = i / 100000 % 10;
    int d = i / 10000 % 10;
    int e = i / 1000 % 10;
    int f = i / 100 % 10;
    int g = i / 10 % 10;
    int h = i % 10;
    if(a + b + c + d == e + f + g + h && check(i))
      ans++;
  }

  cout<<ans<<endl;
  return 0;
}

第二题:重合次数

问题描述
在同一天中, 从上午 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.

样例输入

5 3
L 3
L 2
R 1

样例输出

2 3 4 5 1

每个位置都有对应的权重

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

再排序权重,即得到序列

#include<iostream>
#include<algorithm>
using namespace std;

typedef pair<int, int> PII;
const int N = 200010;
int n, m;
PII a[N];

bool cmp(PII a, PII b){
  return a.second < b.second;
}

int main(){
  scanf("%d%d", &n, &m);

  for(int i = 1; i <= n; i++){
    a[i].first = i;
    a[i].second = i;
  }

  int cnt1 = -3e6 + 1, cnt2 = 3e6 + 1;
  while(m--){
    string op; int x;
    cin>>op; cin>>x;
    if(op == "L") a[x].second = cnt1--;
    else a[x].second = cnt2++;
  }

  sort(a + 1, a + 1 + n, cmp);

  for(int i = 1; i <= n; i++)
    cout<<a[i].first<<" ";

  return 0;
}

第四题:近似gcd

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

还得是梗佬,厉害厉害

参考佬代码写的

#include<iostream>
using namespace std;

typedef long long LL;
int n, g, a[100010];

int main(){
  scanf("%d%d", &n, &g);

  for (int i = 1; i <= n; ++i) {
        int x;
        cin >> x;
        a[i] = (x % g == 0);
        a[i] += a[i - 1];
    }
    int l = 0;
    LL ans = 0;
    for (int r = 2; r <= n; ++r) {
        while (l + 1 < r && a[r] - a[l] < r - l - 1) l++;
        ans += r - l -1;
    }

    cout << ans << endl;
  return 0;
}
  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Libert_AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值