前言
2019年B组省赛感觉就是暴力杯,做八题完全没问题,直接跑答案就可以了,作为一个大一的萌新,感觉还可以,写了9题,拿了个省一美滋滋。
题目百度云链接链接:https://pan.baidu.com/s/1TdiiOMiny6K0zHgg9TNbQA
提取码:wrzh
A: 组队
直接搜索就完了(比赛的时候我是手算的,笑死)
#include<iostream>
using namespace std;
int a[30][6],flag[20]={0};
int maxx=0;
void dfs(int ind,int sum){
if(ind==6){
maxx=max(maxx,sum);
return;
}
for(int j=0;j<20;j++){
if(!flag[j]){
flag[j]=1;
dfs(ind+1,sum+a[j][ind]);
flag[j]=0;
}
}
}
int main(){
int n=6,m=20;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
dfs(1,0);
printf("%d",maxx);
return 0;
}
B: 年号字串
这题感觉有点问题,不是纯粹的26进制,处理出来的数字与字母是+1的映射关系
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main(){
string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",s;
int n=2019,ans=0;
while(n){
ans=n%26;
s+=str[ans-1];
n/=26;
}
reverse(s.begin(),s.end());
cout << s;
return 0;
}
C: 数列求值
数字有点大,来个滚动数组处理一下,模10000就可以得到后四位数了
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main(){
int s=0,n=20190324;
int f[3]={1,1,1};
for(int i=3;i<n;i++){
f[i%3]=(f[(i-1)%3]+f[(i-2)%3]+f[(i-3)%3])%10000;
}
cout << f[(n-1)%3];
return 0;
}
D: 数的分解
这题直接找就行了,应该还有更好更快的方法,我这里就不考虑了
#include<iostream>
using namespace std;
int flag(int x){
if(x<=0) return 0;
while(x){
int ans=x%10;
if(ans==2 || ans==4) return 0;
x/=10;
}
return 1;
}
int main(){
int n=2019,ans=0;
for(int i=1;i<2019;i++){
if(flag(i)){
for(int j=i+1;j<2019;j++){
if(flag(j)){
int k=2019-i-j;
if(flag(k) && k>j)
ans++;
}
}
}
}
cout << ans;
return 0;
}
E: 迷宫
这题比赛的时候做上头了,一直想用dfs做,是可以做出来,但是我的方法跑的时间太长了,等不起就随便填了个答案,对于求这种迷宫的最短路还是用bfs好,代码都不是很长。
#include<iostream>
#include<queue>
using namespace std;
int dir[4][2]={1,0,0,-1,0,1,-1,0};
string point="DLRU";
char ans[1001];
string maze[35];
int n=30,m=50;
int vis[30][50]={0};
typedef pair<int,int> p;
typedef pair<p,string> P;
queue<P> que;
int main(){
for(int i=0;i<n;i++){
cin >> maze[i];
}
que.push(P(p(0,0),""));
vis[0][0]=1;
while(!que.empty()){
P now = que.front();
que.pop();
p res=now.first;
if(res.first==n-1 && res.second==m-1){
cout << now.second;
return 0;
}
for(int i=0;i<4;i++){
int x=res.first+dir[i][0];
int y=res.second+dir[i][1];
if((x>=0&&x<n&&y>=0&&y<m)&&vis[x][y]==0&&maze[x][y]=='0'){
vis[x][y]=1;
que.push(P(p(x,y),now.second+point[i]));
}
}
}
return 0;
}
F: 特别数的和
数据似乎不大,所以循环判断即可
#include<iostream>
#include<queue>
using namespace std;
int ans(int x){
while(x){
if(x%10==1||x%10==2||x%10==9||x%10==0) return 1;
x/=10;
}
return 0;
}
int main(){
int n,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
sum+=ans(i)?i:0;
}
printf("%d",sum);
return 0;
}
G: 完全二叉树的权值
模拟一下完全二叉树的结构,把每一层的权值加起来,找到权值总和最大的一层就行了,要注意最后一层节点数不完全为2的幂,要处理一下
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n,sum=0,deep=0,maxx=-1000000,minn=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
sum+=x;
if(i==pow(2,deep) || i==n){
if(maxx<sum){
maxx=sum;
minn=deep;
}
deep++;
sum=0;
}
}
printf("%d",minn);
return 0;
}
H: 等差数列
这题不能简单地找最小的差值,要找差值的最大公约数,这样就可以保证有解,另外处理一下公差为0的情况
#include<iostream>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
signed main(){
int n,a[100010],ind;
cin >> n;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
ind=a[1]-a[0];
if(ind==0) return !(cout<<n<<endl);
sort(a,a+n);
for(int i=1;i<n;i++){
ind=__gcd(ind,a[i]-a[i-1]);
}
cout << (a[n-1]-a[0])/ind+1 << endl;
return 0;
}
I: 后缀表达式
这题应该好写,只要用所有的’+'号把大的数字加起来,剩下的数字再减去就行了,但是真的有这么简单吗,这题分还不少,想一下后缀和中缀的区别,后缀是有隐含括号的,像输入数据0 2 1 2 3
,得出的结果应该是4
,所以要考虑有括号的情况。
#include<iostream>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
#define int long long
signed main(){
int n,m,a[200010],sum=0,cnt=0,k;
cin >> n >> m;
k=n+m+1;
for(int i=0;i<k;i++){
cin >> a[i];
}
if(!m){
for(int i=0;i<k;i++){
sum+=a[i];
}
}else{
sort(a,a+k);
sum=sum-a[0]+a[k-1];
for(int i=1;i<k-1;i++){
sum+=abs(a[i]);
}
}
cout << sum;
return 0;
}
J: 灵能传输
这题真不会了
在这里插入代码片