目录
前言
本文概述:蓝桥杯、ICPC等算法竞赛入门题单之选择结构,整理出了该题单中值得一做的题目并附带考点和详细的解题思路。
作者介绍:作者本人是一名人工智能炼丹师,目前在实验室主要研究的方向为生成式模型,对其它方向也略有了解,希望能够在优快云这个平台上与同样爱好人工智能的小伙伴交流分享,一起进步。谢谢大家鸭~~~
如果你觉得这篇文章对您有帮助,麻烦点赞、收藏或者评论一下,这是对作者工作的肯定和鼓励。
题解文章汇总
入门部分(有一定基础的可以直接跳到初级部分)
【C/C++】蓝桥杯算法必刷题(一)标签:思维、数论、贪心
【C/C++】蓝桥杯算法必刷题(二)标签:思维
【C/C++】蓝桥杯算法必刷题(三)标签:二进制、二进制枚举、思维
待更新~~~
初级部分
待更新~~~
高级部分
待更新~~~
题目传送门:算法必刷题(二)
该题单只用做如下题目即可(精选):
B-卡拉兹函数
E-CSimplemathproblem
F-吃瓜群众
H-小铭的回答
J-判断闰年
N-送分题
T-排队领水
Q-前天是那天
先独立完成在对题解哦~~~~~~~~~
将该算法入门所有题单系统刷完,将拥有蓝桥杯B组国一、ICPC/CCPC铜牌的水平
该题单中第一类考点:思维
B-卡拉兹函数
思维、判断奇偶数的最快操作是位运算,n&1==1 则n为奇数 否则n为偶数。使用其它判断方法有些题会超时
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n=0;
cin>>n;
if(n&1==1){
cout<<3*n+1<<endl;
}
else{
cout<<n/2<<endl;
}
return 0;
}
E-CSimplemathproblem
水题,放出来是为了介绍下c++ longlong类型最大可以支持9.2*10^18,这里数据最大才到10^14,所以不用使用大数运算模板(后面会提到)
#include<iostream>
using namespace std;
int main()
{
long long x,y;
cin>>x>>y;
if(y%x==0)cout<<(x+y);
else cout<<(y-x);
return 0;
}
F-吃瓜群众
水题、只用记住结论就好,除了2以外的偶数都可以拆分为2个偶数
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n=0;
cin>>n;
if(n==2||(n&1==1)){
cout<<"NO, you can't divide the watermelon into two even parts.";
}
else{
cout<<"YES, you can divide the watermelon into two even parts.";
}
return 0;
}
H-小铭的回答
思维、假设我们与小姐姐的距离是n,那我们走n步就可以到了,但是我们可以多走吗?多走也是可以的,只要多走的步数是偶数就可以走回来(n步走到小姐姐哪里,然后第n+1步往前走一步,第n+2步走回来)。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,n;
cin>>a>>b>>n;
if((n-abs(a)-abs(b))>=0&&(n-abs(a)-abs(b))%2==0)
{
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
J-判断闰年
水题、但是经常容易考到这个知识点,记住两个样例帮助记忆一个是100不是闰年 400是闰年
#include<bits/stdc++.h>
using namespace std;
int main(){
int n=0;
cin>>n;
if(n%400==0||(n%4==0&&n%100!=0)){
cout<<"yes";
}
else{
cout<<"no";
}
return 0;
}
N-送分题
思维、这题有个最容易想的笨办法就是将所有可能的组合列出来,然后判断大小,另外一种是:当两个正数中没有1时,这时两个数相乘的值肯定是最大的,因此我们只要考虑乘数中有1的情况就好了
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b,c;
cin>>a>>b>>c;
if(a==1&&c==1){
cout<<a+b+c<<endl;
}
else if(a==1||b==1||c==1){
cout<<max((a+b)*c,a*(b+c))<<endl;
}
else{
cout<<a*b*c<<endl;
}
return 0;
}
T-排队领水
思维、数形合一,其实主要有两种情况:
我们用a=2,b=2,n=6来做例子,<1 2> 3 4(5 6)
一种是当a+b<n的情况,这种情况下,约束条件主是要b,所以我们只有b+1种情况。
我们用a=5,b=1,n=6来做例子,<1 2 3 4 5>(6)
或者a=5,b=2,n=6,<1 2 3 4 (5>6)
另一种情况是a+b>=n的情况,这种情况下只有n-a种情况
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n,a,b;
cin>>n>>a>>b;
if(a+b<n){
cout<<b+1<<endl;
}
else{
cout<<n-a;
}
return 0;
}
Q-前天是那天
模板题,涉及这种时间问题,我们一般都使用一个二维数组将润年和平年的每月日期分别储存起来。
#include<bits/stdc++.h>
using namespace std;
int y[2][13]={{31,31,28,31,30,31,30,31,31,30,31,30,31},
{31,31,29,31,30,31,30,31,31,30,31,30,31}};
int main(){
int year,month,day,a,b,c;
scanf("%d-%d-%d",&year,&month,&day);
day-=2;
if(day<=0){
if(year%4==0&&year%100!=0||year%400==0)
day+=y[1][month-1];
else
day+=y[0][month-1];
month--;
if(month==0){
month=12;
year--;
}
}
printf("%04d-%02d-%02d\n",year,month,day);
}
尾言
如果您觉得这篇文章对您有帮忙,请点赞、收藏。您的点赞是对作者工作的肯定和鼓励,这对作者来说真的非常重要。如果您对文章内容有任何疑惑和建议,欢迎在评论区里面进行评论,我将第一时间进行回复。