蓝桥杯刷题第十三天
第一题:特殊日期
问题描述
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 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 个整数, N 和 M 。
以下 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≤x≤N.
样例输入
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;
}