赛内题解
成绩分析
思路
水题一个排序,一个和解决。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
int s[10000];
int n;
cin>>n;
int i;
double sum=0;
for(i=0;i<n;i++)
{
cin>>s[i];
sum+=s[i];
}
sort(s,s+n);
cout<<s[n-1]<<'\n';
cout<<s[0]<<'\n';
printf("%.2lf",sum/n);
}
整数序列
思路
水题直接每次除二即可。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll n;
cin>>n;
while(n)
{
cout<<n<<' ';
n/=2;
}
}
解码
解码
用一个字符串数组去构建就好了,但是忘记了终止了,赛内狠狠wa了,但是思路没错。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[105];
cin >> s;
int cnt=0;
char ans[1000];
for (int i = 0; i <strlen(s); i ++)
{
if(s[i] >= '0' && s[i] <= '9')
{
for (int j = 0; j < (s[i] - '0') - 1; j ++)
{
ans[cnt++] = s[i - 1];
}
}
else ans[cnt++]=s[i];
}
ans[cnt]=0;
cout << ans << endl;
return 0;
}
P8722 [蓝桥杯 2020 省 AB3] 日期识别
思路
水题,月份可以直接去判断。后面的两个数字判断前面的是不是0就好了。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
char k[6];
cin>>k;
char n[4];
int i,j,flag=0;
for(i=0;i<3;i++)
n[i]=k[i];
for(i=0;i<12;i++)
{
for(j=0;j<3;j++) {
if (n[j]==s[i][j])
flag=1;
else
{
flag=0;
break;}
}
if(flag) {
cout << i + 1 << ' ';
break;
}
}
if(k[3]!='0')
cout<<k[3];
cout<<k[4];
}
补题
乘法表
思路
构建一个表格形式,可以构造出最大到36进制的乘法表。那么可以把十到三十五的数字先用字母替换,0到9则保持原样,再去用一个字符串去储存最后输出的每一位数字即可。
代码
#include<bits/stdc++.h>
using namespace std;
char number[40];//储存0到35的数最后的表达形式。
int n;
string change(int k)
{
string s;
while(k)
{
s+=number[k%n];//把得到的那个字母或者数字表达的数放到s里
k/=n;
}
reverse(s.begin(),s.end());//由于个位先到s里面所以说需要翻转一下
return s;
}
int main()
{
cin>>n;
int i,j;
for(i=0;i<=9;i++) number[i]='0'+i;//用数组储存每一位数字最后的表达形式
for(i=10;i<=35;i++) number[i]='A'+i-10;
for(i=1;i<n;i++)
{
for(j=1;j<=i;j++)
cout<<number[i]<<'*'<<number[j]<<'='<<change(i*j)<<' ';
cout<<endl;
}
}
反思:赛内没有考虑到超出10的情况,思路不够全面导致了出错,没有想到上面那种方法。
走方格
原来本来想要用dfs的,但是会超时,所以说不太行,选择使用动态规划。
代码
#include<gits.stdc++.h>
using namespace std;
int n,m,ans;
int dp[35][35];
int main()
{
cin>>n>>m;
if(n%2 == 0 && m%2 == 0) cout<<"0";
else
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
if(i == 1 && j == 1) f[i][j] = 1;//初始化一下,第一格走法为1
else if(i % 2 == 1 || j % 2 == 1) dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
cout<<dp[n][m]<<endl;
}
return 0;
}