A:组队
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,
组成球队的首发阵容。
每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1
号位至 5 号位的评分之和最大可能是多少?
1 97 90 0 0 0
2 92 85 96 0 0
3 0 0 0 0 93
4 0 0 0 80 86
5 89 83 97 0 0
6 82 86 0 0 0
7 0 0 0 87 90
8 0 97 96 0 0
9 0 0 89 0 0
10 95 99 0 0 0
11 0 0 96 97 0
12 0 0 0 93 98
13 94 91 0 0 0
14 0 83 87 0 0
15 0 0 98 97 98
16 0 0 0 93 86
17 98 83 99 98 81
18 93 87 92 96 98
19 0 0 0 89 92
20 0 99 96 95 81
// 直接手算的。。。 490
B、年号字串
小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27
以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对
应 28,AZ 对应 52,LQ 对应 329。
请问 2019 对应的字符串是什么?
参考: CSDN
int main() {
int c[100];
int temp, i = 0;
int k = 2019;
while(k) {
temp = k % 26;
c[i ++] = temp;
k /= 26;
}
for(int j = i - 1; j >= 0; j -- ) {
printf("%c", 'A' + c[j] - 1);
}
}
C:数值求和
#include <iostream>
using namespace std;
typedef long long LL;
LL f[100000000];
int main(){
f[1] = f[2] = f[3] = 1;
for(int i = 4; i <= 20190324; i ++) {
f[i] = (f[i - 1] + f[i - 2] + f[i - 3]) % 10000;
}
cout << f[20190324] << endl;
return 0;
}
D:数的分解
暴力做法
#include<iostream>
using namespace std;
bool check(int k){
while(k) {
int w = k % 10;
if(w == 2 || w == 4) return false;
k /= 10;
}
return true;
}
int main()
{
int res = 0;
for(int i = 1; i <= 2019; i ++) {
if(check(i)) {
for (int j = i + 1; j <= 2019; j ++) {
if(check(j)) {
int k = 2019 - j - i;
if(check(k) && k > j) {
res ++;
}
}
}
}
}
cout << res;
return 0;
}
dfs
#include <iostream>
using namespace std;
const int N = 3000;
bool vis[N];
int cnt;
// 判断所选的数合法性
bool check(int k){
while(k) {
int w = k % 10;
if(w == 2 || w == 4) return false;
k /= 10;
}
return true;
}
// u 表示当前第几个数,sum 表示当前所有数的和,start 表示当前从哪个数开始选
void dfs(int u, int sum, int start) {
if(sum > 2019) return ;
if(u == 3) {
if(sum == 2019) {
cnt ++;
return ;
}
else return ;
}
for (int i = start; i < 2020; i ++ ) {
if(!vis[i] && check(i)) {
vis[i] = true;
dfs(u + 1, sum + i, i + 1);
vis[i] = false;
}
}
}
int main() {
dfs(0, 0, 1);
cout << cnt;
return 0;
}
迷宫
不会保存最短路径,只求了最短的距离
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 100;
char g[N][N]; // 地图
int dist[N][N]; // 距离
char fx[] = {'D', 'L', 'R', 'U'};
int minv = 1000;
int path[N];
// 最优的方向变量 下 < 左 < 右 < 上
int dx[] = {1, 0, 0, -1}, dy[] = {0, -1, 1, 0};
// 判断该点能不能走
bool check(int x, int y) {
if(x < 0 || x >= 30 || y < 0 || y >= 50) return false;
if(g[x][y] == '1') return false;
if(dist[x][y] != -1 ) return false;
return true;
}
// 倒序搜索,相当于得到每个点到终点的距离
bool bfs() {
queue<PII> q;
q.push({29, 49});
memset(dist, -1, sizeof dist);
dist[29][49] = 0;
while(q.size()) {
PII t = q.front();
q.pop();
for(int i = 0; i < 4; i ++) {
int x = t.first + dx[i], y = t.second + dy[i];
if(x == 0 && y == 0) {
dist[x][y] = dist[t.first][t.second] + 1;
return true;
}
if(check(x, y)){
dist[x][y] = dist[t.first][t.second] + 1;
q.push({x, y});
}
}
}
}
// 正序宽搜
bool bfsPath() {
queue<PII> q;
q.push({0, 0});
int k = 0;
minv = dist[0][0];
while(q.size()) {
PII t = q.front();
q.pop();
int nextx, nexty;
// 寻找最佳下一步位置
for(int i = 0; i < 4; i ++) {
int x = t.first + dx[i], y = t.second + dy[i];
if(x == 29 && y == 49) {
path[k] = i;
return true;
}
if(dist[x][y] == minv - 1 ) {
nextx = x;
nexty = y;
path[k] = i;
minv = dist[x][y];
}
}
q.push({nextx, nexty});
k ++;
}
}
int main(){
for(int i = 0; i < 30; i ++ ) scanf("%s",g[i]);
for(int i = 0; i < 30; i ++ ) {
for(int j = 0; j < 50;j ++) {
printf("%c", g[i][j]);
}
cout << endl;
}
bfs();
cout << dist[0][0] << endl;
for(int i = 0; i < 4; i ++) {
for (int j = 0; j < 6; j ++ ){
printf("%d ", dist[i][j]);
}
cout << endl;
}
memset(path, -1, sizeof path);
bfsPath();
for (int i = 0; i < N; i ++ ) {
if(path[i] != -1) {
if(path[i] == 0 ){
printf("D");
}else if(path[i] == 1){
printf("L");
}else if(path[i] == 2){
printf("R");
}else{
printf("U");
}
}
}
return 0;
}
/*
010000
000100
001001
110000
dist[]
10 -1 6 5 4 5
9 8 7 -1 3 4
10 9 -1 3 2 -1
-1 -1 3 2 1 0
path[]
0 2 2 3 2 2 0 0 0 2
4 * 6
[3][5] 下 左 右 上
0 1 2 3
10
0 2 2 3 2 2 0 0 0 2
*/
特别数的和
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int res;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) {
int t = i % 10;
int c = i;
while(c) {
if (t == 2 || t == 0 || t == 1 || t == 9) {
res += i;
break;
}
c = c / 10;
t = c % 10;
}
}
cout << res ;
return 0;
}
完全二叉树的权值
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int a[N] ;
LL maxs = -1e18; // 最大的权重层的值
int depth = 0; // 最大的权重层所在的深度
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
// 外循环深度 d 与每一层的起点下标 i
for (int d = 1, i = 1; i <= n; i *= 2, d ++ ) {
LL s = 0;
// 循环当前层的所有叶子,注意边界
for (int j = i; j < 2 * i && j < n; j ++ ) s += a[j];
if (s > maxs) {
maxs = s;
depth = d;
}
}
cout << depth;
return 0;
}
what