第一题:跑步训练
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n=10000;
int ans=0;
while(n>0)
{
for(int i=0;i<60;i++)
{
n-=10;
ans++;
if(n==0) break;
}
if(n==0) break;
n+=300;
ans+=60;
}
cout<<ans<<endl;
return 0;
}
第二题:纪念日
#include<bits/stdc++.h>
using namespace std;
int isleaf(int n)
{
if((n%400==0)||(n%4==0&&n%100!=0)) return 366;
else return 365;
}
int main()
{
int ans=0;
for(int i=1922;i<=2020;i++)
{
ans+=isleaf(i);
}
ans-=22;
cout<<ans*24*60;
return 0;
}
第三题:合并检测
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k=0;
int min=100;
for(int i=100;i>1;i--)
{
int temp=100/i;
if(100%i!=0) temp++;
temp+=i;
if(temp<min)
{
min=temp;
k=i;
}
}
cout<<k;
return 0;
}
第五题:矩阵
#include<bits/stdc++.h>
using namespace std;
//f[i][j]:所有第一行有 i 个数字, 第二行有 j 个数字的方案数量
int f[1020][1020]; //不要放在main函数里面
int main()
{
f[0][0]=1;//一个数字都不放也是一种放置方式
for(int i=0;i<=1010;i++)
{
for(int j=0;j<=1010;j++)
{
if(i-1>=j)
f[i][j]+=f[i-1][j];//放在第一行
if(j>0)
f[i][j]+=f[i][j-1];//放在第二行
f[i][j]%=2020;
}
}
cout<<f[1010][1010];
return 0;
}
第八题:走方格
解法一:dfs
#include<bits/stdc++.h>
using namespace std;
int mp[50][50];
int n,m;
int ans=0;
void dfs(int x,int y)
{
if(x==n&&y==m)
{
ans++;
return;
}
if(x>30||y>30) return;
if(((x+1)%2!=0)||y%2!=0) dfs(x+1,y);
if((x%2!=0)||(y+1)%2!=0) dfs(x,y+1);
}
int main()
{
cin>>n>>m;
dfs(1,1);
cout<<ans<<endl;
return 0;
}
解法二:动态规划
#include<bits/stdc++.h>
using namespace std;
//int dp[35][35];
int main(){
int n,m;
cin>>n>>m;
vector<vector<int>> dp(n+1,vector<int>(m+1,0));
for(int i=1;i<=m;i++)dp[1][i]=1;
for(int i=1;i<=n;i++)dp[i][1]=1;
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
if(i%2==0&&j%2==0)continue;
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
cout<<dp[n][m]<<endl;
return 0;
}