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,比例简化
暴力求解:可以在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,圆形牛棚
暴力求解:将每个牛棚牛的数量存入一个数组,然后枚举从一个门进入的前后牛棚牛群走的步数
即如下
#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;
}
反思枚举时,一定要多枚举几次,找到规律!!!