压线通过蓝桥初赛,是能震惊一整年的程度。
6.5复赛,只会暴力是不行的。
于是得了国优…大三心态完全不同,目标:至少刷近五年的决赛真题并打卡。冲就完事。
-------------------2020蓝桥国赛A组(C++ ---------------------------------
A合数个数:一个数如果除了 1 和自己还有其他约数,则称为一个合数。例如:1, 2, 3不是合数,4, 6 是合数。请问从 1 到 2020 一共有多少个合数。
答案:1713
思路:暴力(注意边界,细心点
#include <iostream>
#include <cmath>
using namespace std;
bool check(int x){ //质素检验函数
for (int i=2;i<int(sqrt(x))+1;i++){
if (x%i==0) return true;
}
return false;
}
int main(){
int res=0;
for (int i=4;i<2021;i++){
if (check(i)) res+=1;
}
cout<<res<<endl;
return 0;
}
B:含 2 天数
题目:如果日历中只显示年月日,请问从公元 1900 年 1 月 1 日到公元 9999 年 12月 31 日,一共有多少天日历上包含 2。即有多少天中年月日的数位中包含数字2。
思路:1 3 4 5 6 7 8 9 10 11月含有12天个2【2、12、20-29】;
闰年2月含29天2,平年2月含28个2;12月含31个2。
年份含2时,闰年含366天,平年含365天。
注意平闰判断方法!
答案:1994240
#include <iostream>
using namespace std;
int num[4]={366,365,180,179};
bool year(int x){ //判断闰年平年
if ((x%100)==0 && (x%400==0))return true;
if ((x%100) && (x%4)==0) return true;
return false;
}
bool have2(int x){ //判断年份是否含2
while (x){
if (x%10==2) return true;
x/=10;
}
return false;
}
int main(){
int res=0;
for (int i=1900;i<=9999;i++){
if (have2(i)){ //年份含2
if (year(i)) res+=num[0]; //闰年
else res+=num[1]; //平年
}
else{
if (year(i)) res+=num[2];
else res+=num[3];
}
}
cout<<res;
return 0;
}
C: 本质上升序列
思路:典型的动态规划,dp[i]存储以i结尾的递增序列的个数。
注意如何去掉本质相同的子序列!
答案:3616159
#include <iostream>
using namespace std;
typedef long long ll;
ll dp[1000];
void init(){ //动态规划矩阵初始化
for (int i=0;i<200;i++) dp[i]=1;
}
int main(){
string in="tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl";
init();
ll sum=0;
for (int i=1;i<200;i++){
for (int j=0;j<i;j++){
if (in[j]<in[i]) dp[i]+=dp[j];
else if (in[i]==in[j]) dp[i]-=dp[j]; //本质相同者去掉
}
}
for (int i=0;i<200;i++) sum+=dp[i];
cout<<sum;
return 0;
}
E: 玩具蛇
题目:小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。小蓝还有一个 4 × 4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A 到 P 共 16 个字母。小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。
思路:DFS——visit置1,搜索下一层,visit置0。
答案:552
#include <iostream>
using namespace std;
int visit[4][4],cnt=0; //设置是否经过,计数
int x[4]={-1,0,1,0},y[4]={0,-1,0,1}; //探索方向
void init(){ //重新开始的初始化函数
for (int i=0;i<4;i++){
for (int j=0;j<4;j++) visit[i][j]=0;
}
}
void dfs(int i,int j,int step){
if (step==16){ //数字16被放置成功
cnt+=1;
return;
}
for (int k=0;k<4;k++){
int nx=i+x[k],ny=j+y[k];
if (nx<0 || ny<0 || nx>3 || ny>3 || visit[nx][ny]==1) continue; //违规数据和已占格子
visit[nx][ny]=1;
dfs(nx,ny,step+1); //搜索下一层
visit[nx][ny]=0;
}
}
int main(){
for (int i=0;i<4;i++){
for (int j=0;j<4;j++){
init();
visit[i][j]=1;
dfs(i,j,1); //开始本次搜索
visit[i][j]=0;
}
}
cout<<cnt<<endl;
return 0;
}
链接: 2020国赛题目.
2019国赛:部分题目+解析链接.
2018国赛:部分题目+解析链接.
2017国赛:部分题目+解析链接.
2016国赛:部分题目+解析链接.
2013-2017部分题目+解析整理.
总结:感谢大佬们!!!(不要随便立flag & 明天去凑个人头
--------- 来自6.5半夜十二点半睡不着的小傻瓜--------------------