目录
前言
本文概述:蓝桥杯、ICPC等算法竞赛入门题单之循环结构,整理出了该题单中值得一做的题目并附带考点和详细的解题思路。
作者介绍:作者本人是一名人工智能炼丹师,目前在实验室主要研究的方向为生成式模型,对其它方向也略有了解,希望能够在CSDN这个平台上与同样爱好人工智能的小伙伴交流分享,一起进步。谢谢大家鸭~~~
如果你觉得这篇文章对您有帮助,麻烦点赞、收藏或者评论一下,这是对作者工作的肯定和鼓励。
题解文章汇总
入门部分(有一定基础的可以直接跳到初级部分)
【C/C++】蓝桥杯算法必刷题(一)标签:思维、数论、贪心
【C/C++】蓝桥杯算法必刷题(二)标签:思维
【C/C++】蓝桥杯算法必刷题(三)标签:二进制、二进制枚举、思维
待更新~~~
初级部分
待更新~~~
高级部分
待更新~~~
题目传送门:算法必刷题(三)
该题单只用做如下题目即可(精选):
1018、有趣的二进制
1019、[NOIP2006]数列
1020、只能吃土豆的牛牛
1026、栗酱的文明2
1030、Game
1037、焦虑的蚂蚁
1046、鹏
1047、D博弈与核心能源动力
1055、最大公因数
先独立完成在对题解哦~~~~~~~~~
将该算法入门所有题单系统刷完,将拥有蓝桥杯B组国一、ICPC/CCPC铜牌的水平
该题单中第一类考点:二进制
1018、有趣的二进制
二进制、模板题
#include<bits/stdc++.h>
using namespace std;
long long lowbit(long long n){
long long res=0;
while(n){
n=n&(n-1);
res++;
}
return res;
}
int main()
{
long long n;
while(cin>>n){
cout<<lowbit(n)<<endl;
}
return 0;
}
1019、[NOIP2006]数列
二进制枚举,我们观察下给出来的例子,(1*3^0),(0*3^0+1*3^1),(1*3^0+1*3^1),(0*3^0+0*3^1+1*3^2)刚好1到4的二进制是 1,10,11,100。然后反转后就是上面的前缀乘数
#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;
}
1020、只能吃土豆的牛牛
二进制枚举,同上,只不过这次是从0开始算 0-5的二进制分别为0,1,10,11,100
#include<iostream>
using namespace std;
int main()
{
long long a[100];
a[0]=1;
for(int i=1;i<=33;i++){
a[i]=a[i-1]*3;
}
int t;
int cnt=0;
long long res;
cin>>t;
while(t--){
cnt++;
int n;
cin>>n;
res=0;
for(int i=0;i<32;i++){
if(n>>i&1){
res+=a[i];
}
}
printf("Case #%d: %lld\n",cnt,res);
}
}
该题单中第二类考点:思维
1026、栗酱的文明2
思维、我们先进行降序排序,第i个国家要想建交(i≥1),就要和前面i-1个国家建立外交(前面i-1个国家土地数量都大于第i个国家,所以不用考虑),则a[i]≥i为条件,排序后满足该条件的国家之间可以相互建立外交关系。
#include<bits/stdc++.h>
using namespace std;
//降序排列
int cmp(int a, int b) {
return a > b;
}
int t = 0;//t组数据
int n = 0;//n个国家
int a[1001];//国家的土地数量,因为备注里tidao1≤n≤1000,故可以固定大小
int res = 0;//结果
int main() {
cin >> t;
while(t--) {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];//传入数据,n个国家对应的土地数量存入a[i]
}
//a代表内存地址,从第一个元素到第n个元素按cmp排序
sort(a + 1, a + 1 + n, cmp);
for(int i = 1; i <= n; i++) {
if(a[i] < i) {
//直接记录从左往右第一个不符合的国家的前一个国家,也就是记录排序后符合完美外交的国家列表的右边界
res = i - 1;
break;
}
}
cout<<res<<endl;
}
return 0;
}
1030、Game
思维、 分解因数最终达到不可分解,因此成为求一个数的质因数的数量。谁无法分解谁就输,因此,推出存在偶数个那么Johnson输,反之,Nancy输。
#include<bits/stdc++.h>
using namespace std;
int Prime_num(int n){
int num = 0;
for (int i = 2; i <= n; i++){
while(n % i == 0){
n /= i;
num ++;
}
}
return num;
}
int main(){
int n;
cin>>n;
int k = Prime_num(n);
if (k % 2 == 0) cout<<"Johnson";
else cout<<"Nancy";
}
1037、焦虑的蚂蚁
思维、两只蚂蚁相撞的时候同时掉头(不考虑掉头时间)就相当于两只蚂蚁穿过对方,继续往前走是一样的,然后问题就很简单了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int maxn=0;
int op,x;
while(m--){
cin>>op>>x;
if(op) maxn=max(n-x,maxn);
else maxn=max(x,maxn);
}
cout<<maxn;
return 0;
}
1046、鹏
思维、模拟,定义个变量来标记鹏的状态,当鹏上升的话令标记变量为1,当鹏下降且标记变量为1的时候,次数+1,然后重置标记变量为0
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c,d=0;
int up=0;
cin>>a>>b;
for(int i=2;i<=a;i++){
cin>>c;
if(c>b)
up= 1;
else if(c<b){
if(up)
d++,up= 0;
}
b=c;
}
cout<<d<<endl;
return 0;
}
1047、D博弈与核心能源动力
思维、先用m/p来算买酒的瓶数,然后空酒瓶和瓶盖数也会随之增加,当空酒瓶数和瓶盖数分别大于等于2和4时,我们进行判断,空酒瓶数大于等于2,除2得到喝酒的瓶数,取2的余数则是如果k为奇数的话,会有剩余。瓶盖数大于等于4,除4得到喝酒的瓶数,取4的余数也是求剩余,注意兑换酒后,瓶子和盖子数也要相应增加
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,k,g,p;
cin>>m>>k>>g>>p;
int sum=0;
if(m>0){
int t=m/p;
sum+=t,k+=t,g+=t;
}
while(k>=2||g>=4){
int t=0;
if(k>=2){
t=k/2;
k%=2;
sum+=t,k+=t,g+=t;
}
if(g>=4){
t=g/4;
g%=4;
sum+=t,g+=t,k+=t;
}
}
cout<<sum<<endl;
return 0;
}
1055、最大公因数
用自带的函数__gcd(a,b)求解就好,补充下最小公倍数是__lcm(a,b)
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
int k=__gcd(a,b);
cout<<k<<endl;
return 0;
}
尾言
![]()
如果您觉得这篇文章对您有帮忙,请点赞、收藏。您的点赞是对作者工作的肯定和鼓励,这对作者来说真的非常重要。如果您对文章内容有任何疑惑和建议,欢迎在评论区里面进行评论,我将第一时间进行回复。