文章目录
试题A 组队
解题思路
每个位置尽可能选择分数高的,注意不要一个人选两次!
试题B 年号字串
AC代码
BYQ
#include <stdio.h>
#define N 2019
void fun(){
int i , j , k;
int ans = 0;
for(i = 0; i < 26; i++){ // 0 0 A
for(j = 0; j < 26; j++){ // 0 A
for(k = 1; k < 27; k++){ // A = 1
ans += 1;
if(ans == 2019){
printf("%d %d %d",i, j, k);
// 2 25 17 对应字母表 A 1 B 2...
return;
}
}
}
}
}
int main(){
fun(); //利用函数密封
return 0;
}
试题C 数列求和
解题思路
类似斐波那契,注意每一步都求 mod。
AC代码
4659
#include <stdio.h>
#define mod 10000
int a[20190324]; //数组过大定义在外面
int main(){
a[0] = 1; a[1] = 1; a[2] = 1;
for(int i = 3; i < 20190324; i++){
a[i] = (a[i-1] + a[i-2] + a[i-3])%mod; // %mod !
}
printf("%d", a[20190323]);
}
试题D 数的分解
解题思路:
写两个函数,一个用来检查是否合法。
AC代码
40785
#include <string>
#include <iostream>
using namespace std;
int fun(int n){ //检查合法性
while(n){
int t = n%10;
n = n/10;
if(t == 2 || t == 4)
return 0;
}
return 1;
}
int main(){
int cnt = 0;
for(int i = 1; i < 2019; i++){
if(fun(i)){
// j = i + 1 !!! 不同顺序是一种
for(int j = i+1; j < 2019; j++){
if(fun(j)){
int z = 2019-i-j;
if(fun(z) && z > j) //z > j !!!同一种
cnt++;
}
else
continue;
}
}
else
continue;
}
cout << cnt;
return 0;
}
试题E 迷宫
试题F 特别数的和
AC代码
#include <stdio.h>
#include <iostream>
using namespace std;
int fun(int n){ //检查合法性
while(n){
int t = n%10;
n /= 10;
if(t == 2 || t == 0 || t == 1 || t == 9)
return 1;
}
return 0;
}
int main(){
int n, sum = 0;
scanf("%d", &n);
for(int i = 1; i < n+1; i++){
if(fun(i))
sum += i;
}
printf("%d", sum);
return 0;
}
试题G 完全二叉树的权值
试题H 等差数列
解题思路:
先排序,两两相减,求出最小等差。然后 n = (an - a1) / d + 1,求出n。
AC代码
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
int arr[10000005];
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &arr[i]);
}
sort(arr, arr+n);
int min = 10000000;
for(int i = 0; i < n-1; i++){
int t = arr[i+1] - arr[i];
if(t < min)
min = t;
}
if(min == 0) // 考虑等差为0 !!!
cout << n << endl;
else
cout << (arr[n-1] - arr[0])/min + 1 << endl;
return 0;
}