蓝桥杯培训(2.20)

441. 数字统计 - AcWing题库

1,数字统计

这道题主要考察枚举,从L开始一直枚举R,过程中对每个数进行取余,判断结果是否为2

 方法一: 

枚举(O(nlogn))

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 10010;

int main()
{
    int l, r;
    cin >> l >> r;

    int res = 0;
    for (int i = l; i <= r; i ++ )
        for (int j = i; j; j /= 10)
            if (j % 10 == 2)
                res ++ ;

    cout << res << endl;

    return 0;
}

 方法二: 

简单优化枚举(O(n))

#include <iostream>
using namespace std;
int main(){
    int L,R;
    int ans=0;
    cin>>L>>R;
    for(int i=L;i<=R;i++){
        if(i%10==2)
        ans++;
        if(i/10%10==2)
        ans++;
        if(i/100%10==2)
        ans++;
        if(i/1000%10==2)
        ans++;
        if(i/10000==2)
        ans++;
    }
    cout<<ans;
    return 0;
}

 2,比例简化

 458. 比例简化 - AcWing题库

 暴力求解:可以在L范围内枚举A′和B′,然后根据条件判断A′和B′的最大公约数,再与A/B比较大小,最后找出符合条件的最小值

判断两数的最大公约数

bool gcd(int a,int b){
	return b?gcd(b,a%b):a;
} 
#include <bits/stdc++.h>
using namespace std;
int A,B,L;
int gcd(int i,int j)//判断最大公约数
{
    return j?gcd(j,i%j):i;
}
int main(){
    int m,n;
    double c=1e9;
    cin>>A>>B>>L;
    for(int i=1;i<=L;i++)
        for(int j=1;j<=L;j++)
            if(gcd(i,j)==1){
                double a=i*1.0/j;
                double b=A*1.0/B;
                if(a>=b&&a-b<c)//a-b<c 找出尽可能小的值
                {
                    c=a-b;
                    m=i,n=j;//及时更新c,m,n,找出尽可能小的值
                }
            }
    cout<<m<<' '<<n;
    return 0;
}

 3,圆形牛棚

1843. 圆形牛棚 - AcWing题库

 暴力求解:将每个牛棚牛的数量存入一个数组,然后枚举从一个门进入的前后牛棚牛群走的步数

 即如下

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1010];
int main(){
    ll n,num,sum;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>num;
        a[i]=num;
    }
    for(int i=1;i<=n;i++){
        ll ans=0;
        for(int j=1;j<i;j++)
            ans+=a[j]*(n-i+j);
        for(int k=i+1;k<=n;k++)
            ans+=a[k]*(k-i);
        sum=min(ans,sum);
    }
    cout<<sum;
    return 0;
}

 反思枚举时,一定要多枚举几次,找到规律!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

算法第一深情

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

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

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

打赏作者

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

抵扣说明:

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

余额充值