题目描述
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1号位至 5 号位的评分之和最大可能是多少?
答案
490
直接算就OKK
题目描述
小明用字母 A 对应数字 1,B 对应2,以此类推,用Z对应26。对于27以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对应 28,AZ 对应 52,LQ 对应 329。请问 2019 对应的字符串是什么?
答案
BYQ
因为这个不是标准的26进制,所以我有一些转不过来,就直接用的暴力模拟(类似于日期的那种)。
目测不会超过三位数,所以开了三层。
代码
#include<iostream>
#include<string>
using namespace std;
int res;
char a,b,c;
int main(){
a='A'-1;
b='A'-1;
c='A'-1;
for(int i=0;i<2019;i++){
c++;
if(c=='Z'+1){
b++;
c='A';
if(b=='Z'+1){
b='A';
a++;
}
}
}
cout<<a<<" "<<b<<" "<<c<<endl;
}
题目描述
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字。
答案
4659
类似斐波那契数列,可以开数组存,也可以用数辗转存,因为求最后四位数字,所以只需要存后四位就可以。
代码
#include<iostream>
using namespace std;
int a[3],res;
int main(){
a[0]=a[1]=a[2]=1;
for(int i=3;i<20190324;i++){
res=a[0]+a[1]+a[2];
if(res>10000) res%=10000;
a[i%3]=res;
}
cout<<res<<endl;
}
题目描述
把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和1001+1000+18 被视为同一种。
答案
40785
一定要认真读题,由于交换顺序被视为同一种情况,并且三个数各不相同,所以可以使得三个数满足严格递增(递减)关系,进行遍历。
代码
#include<iostream>
using namespace std;
//含有2或者4返回真
bool f(int a){
int t;
while(a!=0){
t=a%10;
if(t==2||t==4) return true;
a/=10;
}
return false;
}
int main(){
int res=0;
for(int i=1;i<2019;i++){
for(int j=1;j<i;j++){
int k=2019-i-j;
if(k<=0||k>=i||k>=j||f(k)||f(i)||f(j)) continue;
res++;
}
}
cout<<res<<endl;
}
题目描述
下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可
以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。
对于上面的迷宫,从入口开始,可以按DRRURRDDDR
的顺序通过迷宫,一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。
对于下面这个更复杂的迷宫(30行50列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。请注意在字典序中D<L<R<U。
答案
DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUUR
UUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLL
DDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
最短步数,所以想到使用BFS,数据范围也比较小,所以可以用,直接背BFS模板就可以了。
(神奇,这次代码打出来答案就是正确的了,但是上次就是会漏掉第一步)、
开一个字符串数组存每一步路径
dx和dy数组对应那个字典序设置就可以
我没有使用文件录入数据,在录每一行数据的时候行末会多一个空格,要跳过,所以其实每一行录入的数据应该比列数多1,写录数据的部分的时候,可以用小部分测试一下,然后输出看看对不对,有问题对应修改就好。
代码
#include<iostream>
#include<queue>
using namespace std;
struct Node{
int x,y;
};
queue<Node>q;
int dy[4]={0,-1,1,0};
int dx[4]={1,0,0,-1};
char dir[4]={'D','L','R','U'};
int d[55][55],mp[55][55],n,m;
string way[55][55];
string bfs(){
q.push({0,0});
d[0][0]=0;
way[0][0]="";
while(!q.empty()){
Node t=q.front();
q.pop();
for(int i=0;i<4;i++){
int ix=t.x+dx[i];
int iy=t.y+dy[i];
if(ix<0||iy<0||ix>=n||iy>=m||d[ix][iy]!=0||mp[ix][iy]==1) continue;
d[ix][iy]=d[t.x][t.y]++;
way[ix][iy]=way[t.x][t.y]+dir[i];
q.push({ix,iy});
if(ix==(n-1)&&iy==(m-1)) return way[ix][iy];
}
}
}
int main(){
n=30,m=50;
for(int i=0;i<n;i++){
for(int j=0;j<=m;j++){
char t;
scanf("%c",&t);
if(t!='0'&&t!='1')continue;
mp[i][j]=t-'0';
}
}
cout<<bfs()<<endl;
return 0;
}