【C/C++】蓝桥杯算法必刷题(三)目标ICPC铜/蓝桥杯国一

目录

前言

 题解文章汇总

题目传送门:算法必刷题(三)

该题单中第一类考点:二进制

1018、有趣的二进制

1019、[NOIP2006]数列

1020、只能吃土豆的牛牛

该题单中第二类考点:思维

1026、栗酱的文明2

1030、Game

1037、焦虑的蚂蚁

1046、鹏

1047、D博弈与核心能源动力

1055、最大公因数

尾言


前言

本文概述:蓝桥杯、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;
}

尾言

 如果您觉得这篇文章对您有帮忙,请点赞、收藏。您的点赞是对作者工作的肯定和鼓励,这对作者来说真的非常重要。如果您对文章内容有任何疑惑和建议,欢迎在评论区里面进行评论,我将第一时间进行回复。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客柒羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值