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

题目

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

}
cout<<ans1<<' '<<ans2;
return 0;
}

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

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<bits/stdc++.h>
#define ll longlong
using namespace std;
int a[100010];
int main(){

int n = 5;
string s;
int ans = 0;
for(int i = 0; i < n;i++ ){
cin>>s;
if(s[0] == s[2]&& s[3] - s[1] == 1)
ans++;
}
cout<<ans;

return 0;
}

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

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;

const int N = 100010;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
int cnt= 0 ;
for(int i = 1; i<= n-1; i++){
int x = i*i;
if((x % n) < n/2.0){
cnt++;
}
}
cout<<cnt;
return 0;
}

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

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;

const int N = 100010;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

int a,b,n;
cin>>a>>b>>n;
int sum = 0;
int cnt = 1;
while(sum<n){
if(cnt % 7>=1&& cnt%7<=5)
sum+=a;
else
sum+=b;
cnt++;
}
cout<<cnt-1;
return 0;
}

P8706 [蓝桥杯 2020 省 AB1] 解码

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;

const int N = 100010;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

string s;
cin>>s;
for(int i = 0;i < s.size();i++){
if(s[i]>='1'&& s[i]<='9')
for(int j = 0 ; j < s[i]-'1';j++)
cout<<s[i-1];
else
cout<<s[i];
}
return 0;
}

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

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;

const int N = 100010;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

int n;
int a[N];
cin>>n;
for(int i = 0 ;i < n;i++){
cin>>a[i];
}

sort(a,a+n);
double sum = 0;
for(int i = 0 ; i < n;i++)
sum+= a[i];
double ans = sum/n*1.0;
cout<<a[n-1]<<endl<<a[0]<<endl;
printf("%.2lf",ans);
return 0;
}

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

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;

const int N = 100010;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n ;
cin>>n;
while(n>0){
cout<<n<<" ";
n = n>>1;
}
return 0;
}

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

题目

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

string s;
cin>>s;
string s1 = s.substr(0,3);
string s2 = s.substr(3);

cout<<mp[s1]<<" ";
if(s2[0] != '0')
cout<<s2[0];

cout<<s2[1];
return 0;
}

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

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;


const int N = 100010;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

int n;
int ans = 0;
cin>>n;
for(int i = 1;i<=n;i++){
string s = to_string(i);
for(int j =0; j <s.size();j++){
if(s[j] == '0' || s[j] =='1'||s[j] =='2'||s[j] == '9')
{ ans+=i;
break;
}
}
}
cout<<ans;
return 0;
}

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

题目

  • 思路 贪心
  • image.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;


const int N = 100010;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

int n;
cin>>n;
int a,b;
int ans_min = 0,ans_max = 1e9;
for(int i= 0; i< n;i++){
cin>>a>>b;
ans_min = max(ans_min,a/(b+1)+1);
ans_max = min(ans_max,a/b);
}
cout<<ans_min<<" "<<ans_max;
return 0;
}

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

题目

  • 思路 模拟
  • 遇到不同的就反转
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N];

signed main(){

string a,b;
cin>>a>>b;
int cnt = 0;
for(int i = 0 ; i < a.size();i++){
if(a[i]!=b[i]){
a[i] = a[i] == 'o'?'*':'o';
a[i+1] = a[i+1] =='o'?'*':'o';
cnt++;
}

}
cout<<cnt;

return 0;
}

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

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

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f3f
using namespace std;
const int N = 100010;
int a[N],b[N];//长宽
int n,k;

bool check(int mid){
int cnt =0 ;
for(int i = 1 ; i <= n ;i++){
cnt+=(a[i]/mid)*(b[i]/mid);
}
if(cnt>=k)return true;
else return false;
}

signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
for(int i = 1; i <= n;i++){
cin>>a[i]>>b[i];
}
int l = 0;
int r = 10010;
while(l+1<r){
int mid = (l+r)>>1;
if(check(mid))
l = mid;
else
r = mid;
}
if(check(r)) cout<<r;
else cout<<l;
return 0;
}

P8772 [蓝桥杯 2022 省 A] 求和

题目

  • 思路 前缀和 注意数据范围!

  • S=_a_1⋅_a_2+_a_1⋅_a_3+⋯+a_1⋅_an+_a_2⋅_a_3+⋯+_an_−2⋅_an_−1+an_−2⋅_an+an_−1⋅_an

      =(_a_2+_a_3+⋯+_an_)⋅_a_1+(_a_3+_a_4+⋯+_an_)⋅_a_2+⋯+_an_⋅_an_−1
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f3f
using namespace std;
const int N = 200010;
int arr[N],sum[N];
int n;
int ans;
signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i = 1 ; i<=n;i++){
cin>>arr[i];
sum[i] = sum[i-1] + arr[i];
}
for(int i =1 ;i <=n-1 ;i++){
ans += arr[i]*(sum[n]-sum[i]);
}
cout<<ans;
return 0;
}

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

题目

  • 前置知识
    • 去程时间 =飞行时间 + 时差;回程时间 = 飞行时间 − 时差
    • 由此可知 飞行时间 = (去+回)/ 2
  1. 用 scanf 输入前面的时间:
1
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f3f
const int N = 1000010;
using namespace std;

int get()
{
int h1,m1,s1,h2,m2,s2,day=0;
scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
if(getchar()==' ')scanf("(+%d)",&day);
return (day*86400+h2*3600+m2*60+s2)-(h1*3600+m1*60+s1);
}
signed main()
{
int T;
scanf("%d",&T);
while(T--)
{
int ans=(get()+get())/2;
printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%60);
}
return 0;
}

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

题目

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

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

  • 注意上面加粗黑体字 第一次没考虑到 错了两个点 叶子节点需要额外特判
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N];
int n;
int dep = 1,sum = 0,Max = -1,a,ans;
signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i = 1; i <= n; i++){
cin>>a;
sum+=a;
if(i == (1<<dep)-1){//判断当前位置是否是该dep的最后一个节点?结算:go on
if(sum>Max){
Max = sum;
ans = dep;
}
dep++;
sum = 0;
}
}
if(sum>Max){//叶子节点特判
Max = sum;
ans = dep;
}

cout<<ans;
return 0;
}

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

题目

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

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int l, r; cin >> l >> r;
cout << f(r) - f(l - 1) + g(r) - g(l - 1);
return 0;
}

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

题目

  • 思路
  • problem A 填空题 **本地暴力枚举 **
  • 把数字转成字符串去处理
  • 答案为 4430091
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e8;
bool check(string s){
int ans1 = 0 ,ans2 = 0;
for(int i = 0; i < s.size();i++){
if(i<s.size()/2)
ans1 += s[i]-'0';
else
ans2 += s[i]-'0';
}
return ans1 == ans2;
}
signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string s;
int ans = 0;
for(int i = 1 ; i<= N;i++){
s= to_string(i);
if(s.size()%2 == 1)continue;//奇数
if(check(s)) {
ans++;
}

}
cout<<ans;
return 0;
}
  • problem B DFS 本地暴搜
  • 答案为 4165637
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e8;
int arr[N];
int ans;
void dfs(int score,int cnt){
if(cnt>30||score == 100)
return;
if(cnt == 30 && score == 70)
ans++;
dfs(score+10,cnt+1);
dfs(0,cnt+1);
}


signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//表示0分 0题
dfs(0,0);
cout<<ans;
return 0;
}

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

题目
题解参考

  • 思路 看到”连续子序列求和”这一要求时,我们果断选择前缀和解答
  • image.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N],sum[N];
int n,k;
map<int,int> mp;

signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
int ans = 0;
mp[0] = 1;
for(int i = 1; i<=n;i++){
cin>>arr[i];
sum[i] = (sum[i-1]+ arr[i])%k;//记录前缀和模k的值
mp[sum[i]]++;
}
for(int i = 0; i< n;i++){
ans+=(mp[i]*(mp[i]-1))/2;
}
cout<<ans;
return 0;
}
  • 自己的理解

  • image.png

  • image.png

  • 解释:1要和其他1组一起 满足 image.png

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N],sum[N];
int n,k;
map<int,int> mp;

signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
int ans = 0;
for(int i = 1; i<=n;i++){
cin>>arr[i];
sum[i] = (sum[i-1]+ arr[i])%k;//记录前缀和模k的值
mp[sum[i]]++;
}
for(auto i :mp){
if(i.first == 0)
ans+=i.second*(i.second+1)/2;
else
ans+=i.second*(i.second-1)/2;
}
cout<<ans;
return 0;
}

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

题目

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f
#define end '\n'
const int N = 10010;
using namespace std;

signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int w,m,n;
cin>>w>>m>>n;
m--;//预处理
n--;
int x1 = m%w, y1 = m/w,x2 = n%w,y2 = n/w;
if(y1%2 == 1){//判断奇偶层数
x1 = w-1-x1;
}
if(y2%2 == 1){
x2 = w-1-x2;
}
cout<<abs(x2-x1) + abs(y2-y1)<<endl;//绝对值防止n比m大


return 0;
}

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

题目

  • 思路 求公差
  • 这就意味着我们已经知道了最终等差数列的首项和末项,所以我们只需求出公差即可。
  • 为了使项数最少,我们需要公差尽可能地大。
  • 所以任意两项的差均为公差 d 的倍数,于是所求 d 为所有相邻两项差的公约数。又因为 d 要最大,所以 d 就是所有相邻两项差的最大公约数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f
#define end '\n'
const int N = 100010;
using namespace std;
int arr[N];

int gcd(int x,int y){
if(y == 0)
return x;
return gcd(y, x % y);
}

signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i = 1; i <= n ;i++){
cin>>arr[i];
}
sort(arr+1,arr+n+1);//排序
if(arr[1]==arr[n]){//加特判 d为0
cout<<n;
return 0;
}
int d = arr[2]-arr[1];
for(int i = 2 ; i <= n;i++){
d = gcd(d,arr[i]-arr[i-1]);
}
cout<<(arr[n]-arr[1])/d+1<<endl;//求项数
return 0;
}

P8720 [蓝桥杯 2020 省 B2] 平面切分

题目

  • 参考题解
  • 思路
  • 当没有任何直线时,显然平面只有一部分。
  • 当有 1 条直线时,平面有 2 个部分。
  • 当有 2 条直线时,第 2 条直线交第 1 条于一个点,所以增加了 2 个部分,共 4 个部分。
  • 当有 3 条直线时,第 33条直线交前两条各于一个点,所以又增加了 3 个部分,共 7 个部分 (假设没有三线共点或平行)
  • 当有 4 条时,增加 3 个交点,4个部分,共 11个部分。
  • 当有 5 条时,增加 4 个交点,5 个部分,共 16 个部分。

以上推断均保证没有三线共点或平行的情况。
仔细阅读加粗部分显然可以发现,每增加 n 个交点,会多出 n+1 个部分。
我们就成功的把求几部分的问题转化成了求交点的问题。
接着考虑 三点共线平行 的情况。
对于三点共线,若一条直线于另两条直线的交点交在一起 (注意我的表述方式),因为这一点之前已经分出了它所对应的部分,所以不需要再次统计。
对于一对直线平行,则仅对这两条直线来说,它们没有任何交点,因此这对直线不需要计算交点。
综上所述,我们只要模拟以上过程,不断添加一条一条直线并且计算交点个数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
#define PDD pair<long double,long double>
const int N = 100010;
using namespace std;
int n,ans;
long double a[N],b[N];
bool flag[N];//标记第i条直线是否与其他直线重合
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

cin>>n;
for(int i = 1;i<=n;i++){
cin>>a[i]>>b[i];
set<PDD> s;//使用pair记录横坐标、纵坐标
s.clear();
for (int j = 1;j<i;j++){
if(flag[j])//与前面的直线重合,跳过
continue;
if(a[i]==a[j]&&b[i]==b[j]){
flag[i] = 1;//标记
break;
}
if(a[i]==a[j])//斜率一样,i平行与j,无交点
continue;
//计算交点
s.insert({(b[i]-b[j])/(a[j]-a[i]),(a[j]*b[i]-a[i]*b[j])/(a[j]-a[i])});
}
if(!flag[i])//当第i条直线不与前面的直线重合时才统计
ans+=s.size()+1;
}
cout<<ans+1;//初始平面有一部分
return 0;
}

P8651 [蓝桥杯 2017 省 B] 日期问题

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
const int N = 100010;
using namespace std;
int arr[N];
int min_year = 1960,max_year = 2059;
int days[N] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isLeapYear(int year){
if((year %4 == 0&& year %100!= 0)||year %400 ==0)
return true;
else
return false;
}

signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

int a,b,c;
scanf("%d/%d/%d",&a,&b,&c);
for(int year = min_year;year<=max_year;year++){
days[2] = isLeapYear(year)?29:28;
for(int month = 1 ; month<=12;month++){
for(int day = 1; day<=days[month];day++){
if((a == year % 100 && b == month && c == day) ||
(a == month && b == day && c == year % 100) ||
(a == day && b == month && c == year % 100)) // 判断是否符合条件
printf("%d-%02d-%02d\n", year, month, day); // 注意输出的格式
}
}
}
return 0;
}

P8635 [蓝桥杯 2016 省 AB] 四平方和

题目

  • 思路

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
const int N = 100010;
using namespace std;
int arr[N];
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
//从0开始枚举
for(int i = 0; i*i<=n ;i++){
for(int j = 0 ; i*i+j*j<=n;j++){
for(int k = 0 ;i*i+j*j+k*k<=n;k++ ){
int tmp = n-(i*i+j*j+k*k);
int cnt = sqrt(tmp);//开根号 向下取整
if(cnt*cnt == tmp){//当开根能取到整数证明tmp是平方数
cout<<i<<' '<<j<<' '<<k<<' '<<cnt<<endl;
return 0;
}
}
}
}

return 0;
}

P8748 [蓝桥杯 2021 省 B] 时间显示

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N];
int n;

signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
int s = n/1000;
int hh = s/3600%24;
int mm = s%3600/60;
int ss = s % 60;
printf("%02d:%02d:%02d",hh,mm,ss);
return 0;
}

P8781 [蓝桥杯 2022 省 B] 修剪灌木

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N];
int n;

signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i = 1; i<= n;i++){
cout<<max(n-i,i-1)*2<<endl;
}
return 0;
}

P8754 [蓝桥杯 2021 省 AB2] 完全平方数

题目

  • **数论 分解质因数 ** 回头再看一遍

参考题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,p[1000],g[1000],cnt,ans;
int main(){
cin>>n;
for(ll i=2;i*i<=n;i++){
if(n%i==0) cnt++;
while(n%i==0){
p[cnt]=i;//p是质因子
g[cnt]++;//g是这个质因子的指数
n/=i;
}
}
if(n>1){
p[++cnt]=n;
g[cnt]++;
}
//以上是质因数分解模板
ans=1;
for(int i=1;i<=cnt;i++){
if(g[i]%2){//如果指数是奇数
ans*=p[i];//那么就要补一个这个质数
}
}
cout<<ans;
return 0;
}

P8723 [蓝桥杯 2020 省 AB3] 乘法表

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N];
int n;
string jinzhi(int x,int y){
string now,ret;
while(x>0){
int add = x%y;
if(add >=10){
now+=add-10+'A';
}else{
now+=add+'0';
}
x/=y;
}
int len = now.size();
for(int i = 0; i < len;i++){
ret += now[len-i-1];
}
return ret;
}
signed main(){

std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i =1; i<n;i++){
for(int j =1; j<=i;j++){
cout<<jinzhi(i,n)<<"*"<<jinzhi(j,n)<<"="<<jinzhi(i*j,n)<<" ";
}
cout<<endl;
}
return 0;
}

P8783 [蓝桥杯 2022 省 B] 统计子矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 1000;
int n,m,k,ans = 0;
int arr[N][N],sum[N][N];
void scan() {
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> arr[i][j];
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + arr[i][j];
}
}
}
int getSum(int x1,int y1,int x2,int y2){
return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
scan();
// 尺取法,限定上下边界,蠕动左右边界,减少判断次数
for (int i = 1; i <= n; i++) { // 上边界
for (int j = i; j <= n; j++) { // 下边界
for (int col_l = 1, col_r = 1; col_r <= m; col_r++) { // 左右蠕动边界
while (col_l <= col_r && getSum(i, col_l, j, col_r) > k) col_l++;
if (col_l <= col_r) ans += col_r - col_l + 1; // 如果区间合法, 那么说明此矩阵和必定小于等于k, 所以子矩阵也合法
}
}
}
cout<<ans;
return 0;
}

P8637 [蓝桥杯 2016 省 B] 交换瓶子

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 10005;
int a[N];
int n,ans;
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// 贪心 把瓶子放在它该放的位置上
cin>>n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int j=1;j<=n;j++)
{
for (int i=1;i<=n;i++)
{
if(a[i]!=i)
{
swap(a[i],a[a[i]]);
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}