一、含2天数
题目链接:含 2 天数 - 蓝桥云课 (lanqiao.cn)
题目要求:
小蓝特别喜欢 2,今年是公元 2020 年,他特别高兴,因为每天日历上都可以看到 2。
如果日历中只显示年月日,请问从公元 1900 年 1 月 1 日到公元 9999 年 12 月 31 日,一共有多少天日历上包含 2。即有多少天中年月日的数位中包含数字 2。
解题思路:
这是一道模拟题,一提到日期我们就判断闰年日期啥的别忘了就好!
#include<bits/stdc++.h> using namespace std; bool pd(int x) { while(x) { if(x%10==2) { return true; } x/=10; } return false; } int pdd(int x,int y) { if(x%4==0&&x%100!=0&&y==2) { return 29; } else if(x%400==0&&y==2) { return 29; } else if(y==1||y==3||y==5||y==7||y==8||y==10||y==12) { return 31; } else if(y==2) { return 28; } return 30; } int main() { int sum = 0; int n; for(int i=1900;i<=9999;i++) { for(int j=1;j<=12;j++) { int m = pdd(i,j); for(int k=1;k<=m;k++) { if(pd(i)||pd(j)||pd(k)) { sum++; } } } } cout<<sum; return 0; }
二、蓝桥幼儿园
题目链接:蓝桥幼儿园 - 蓝桥云课 (lanqiao.cn)
题目要求:
蓝桥幼儿园的学生是如此的天真无邪,以至于对他们来说,朋友的朋友就是自己的朋友。
小明是蓝桥幼儿园的老师,这天他决定为学生们举办一个交友活动,活动规则如下:
小明会用红绳连接两名学生,被连中的两个学生将成为朋友。
小明想让所有学生都互相成为朋友,但是蓝桥幼儿园的学生实在太多了,他无法用肉眼判断某两个学生是否为朋友。于是他起来了作为编程大师的你,请你帮忙写程序判断某两个学生是否为朋友(默认自己和自己也是朋友)。
解题思路:
这是一个并查集模板提,不会并查集的小伙伴跟着敲理解一下,这个东西很常考的!
#include<bits/stdc++.h> using namespace std; const int maxn = 8e5+5; int s[maxn]; void inita() { for(int i=1;i<=maxn;i++) { s[i] = i; } } int finda(int x) { if(x!=s[x]) { s[x] = finda(s[x]); } return s[x]; } void mergea(int x,int y) { x = finda(x); y = finda(y); if(x!=y) { s[x] = s[y]; } } int main() { int op,n,m,x,y; inita(); cin >> n >> m; while(m--) { cin >> op >> x >> y; if(op==1) { mergea(x,y); } if(op==2) { if(finda(x)==finda(y)) { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } } } return 0; }
三、七星填数
题目链接:七星填数 - 蓝桥云课 (lanqiao.cn)
题目要求:
输出绿色的值 并且每条边相等
解题思路:
全排列,从左到右安排上012345678910(数字不一定是这些,下标是) 对比每条边 如果相等就输出!
#include<bits/stdc++.h> using namespace std; int main() { int a[11]={1,2,3,4,5,7,8,9,10,12,13}; int aa,b,c,d,e,f,g; do{ aa = 6+a[2]+a[5]+11; b = a[0]+a[1]+a[2]+a[3]; c = a[3]+a[5]+a[7]+a[10]; d = 11+a[7]+a[8]+a[9]; e = 14+a[6]+a[9]+a[10]; f = a[0]+a[4]+a[6]+a[8]; g = 14+6+a[1]+a[4]; if(aa==b&&aa==c&&aa==d&&aa==e&&aa==f&&aa==g) { cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]; } }while(next_permutation(a,a+11)); return 0; }
四、日志统计
题目链接:日志统计 - 蓝桥云课 (lanqiao.cn)
题目要求:
小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有 N 行。其中每一行的格式是:
ts id
表示在 ts 时刻编号 idid 的帖子收到一个"赞"。
现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是"热帖"。
具体来说,如果存在某个时刻 T 满足该帖在 [T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是"热帖"。
给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。
解题思路:
结构体 滑窗 统计一下点赞数 如果这次帖子和上次时间差大于等于d 就减少点赞 如果够了 开数组保存 然后遍历输出
#include<bits/stdc++.h> using namespace std; const int N = 100005; struct node{ int ts,id; }a[N]; bool vis[N]; int haash[N]; int cmp(node x,node y) { return x.ts<y.ts; } int main() { int n,d,k; cin>>n>>d>>k; for(int i=0;i<n;i++) { cin>>a[i].ts>>a[i].id; } sort(a,a+n,cmp); for(int i=0,j=0;i<n;i++) { haash[a[i].id]++; while(a[i].ts-a[j].ts>=d) { haash[a[j].id]--; j++; } if(haash[a[i].id]>=k) { vis[a[i].id] = 1; } } for(int i=0;i<N;i++) { if(vis[i]) { cout<<i<<endl; } } return 0; }