题目1:门牌制作
思路:直接暴力,统计从1到2020数字2出现的次数
#include<bits/stdc++.h>
using namespace std;
int check(int n)
{
int ans=0;
while(n>0)
{
int t=n%10;
if(t==2)
ans++;
n/=10;
}
return ans;
}
int main()
{
int cnt=0;
for(int i=1;i<=2020;i++)
{
cnt+=check(i);
}
cout<<cnt<<endl;
}
题目2:货物摆放
思路:因为可以整除,因此L、W、H都应该为n的因子,先查找n的所有因子然后再进行暴力搜索;
查找因子的时候只需要到sqrt(n)即可,同时还需要将n/i加入到因子数组中(重复因子的因子不用在加入)
#include<bits/stdc++.h>
using namespace std;
long long n=2021041820210418;
int len=0;
long long arr[20210418];
map<int,bool>mp;
void find(long long n)
{
for(int i=1;i<=sqrt(n);i++)
{
// 查找因子
if(n%i==0)
{
arr[len++]=i;
mp[i]=true;
// 将n/i得到的因子加入到因子数组,注意要去掉重复的因子
if(!mp[n/i])
arr[len++]=n/i;
}
}
}
int main()
{
int cnt=0;
find(n);
// 暴力拆解
for(int i=0;i<=len;i++)
{
for(int j=0;j<=len;j++)
{
for(int k=0;k<=len;k++)
{
if(arr[i]*arr[j]*arr[k]==n)
{
cnt++;
}
}
}
}
cout<<cnt;
}
题目3:跳跃
思路:对于每一个点,往前面找8个格子(三行三列不包括自身)中的最大的值,然后对该点的值进行更新
#include<iostream>
using namespace std;
const int N=110;
int f[N][N];
int n,m;
void find(int x,int y)
{
int _max=-0x3f3f3f3f;
//注意判断越界条件
for(int i=x;i>=0&&i>=x-3;i--)
{
for(int j=y;j>=0&&j>=y-3;j--)
{
//排除自身
if(i==x&&j==y)continue;
_max=max(f[i][j],_max);
}
}
//如果该点为起点的话,它的权值等于它本身
if(x==0&&y==0)
f[x][y]=f[x][y];
//否则进行更新
else
f[x][y]=f[x][y]+_max;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>f[i][j];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
find(i,j);
}
}
cout<<f[n-1][m-1];
}