A.组队
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。
每位球员担任 1 号位至 5 号位时的评分如下表所示。
请你计算首发阵容 1号位至 5 号位的评分之和最大可能是多少?
分析与过程:
- 浏览图表可知,20位球员,5个位置,且17,18,号球员较为突出,现从中选5人,则要求各不相同。
- 一般思维是,选取各个号位的得分max球员,但7号占据3项max,此时如果立即计算,很容易错误
- 所以,在选的时候,可以取它的三次最大值,同时选择其他项最大值
直接计算max1,2,3, 比较得出,在17号取99的时候,得出了最大值,如图;
正确答案:490
B.年号字串
小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。
对于27以上的数字,小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对应28,AZ 对应52,LQ 对应329。
请问2019 对应的字符串是什么?
分析与过程:
- 很容易想到26进制,给到的样例中没有提到0的表示,所以也无需去想
- 进位的时候常规操作就是,将源数字取模、相除再赋给它判断数字是否为零
- 此处52%26 = 0,的时候应该得Z,52/26得B出现错误,其他情况正常,
- 若将整除26的情况数字修改为n,n-1再除以26 ,则可以有避免这一问题;
用例代码:
//主函数调用mymath(2019);
void mymath(int year){
char s[26] = {'Z','A','B','C','D','E','F','G','H','I','G','K',
'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y'};
//定义一个字符数组,使用0-25 ,0便于进位
string syear = "";
int temp;
while(year){
temp = year % 26;
if(temp == 0){
year --;
}
year = year / 26;
syear = s[temp] + syear;
//注意顺序问题,AZ,syear += s[temp],导致结果逆序
}
cout << syear ;
正确答案:BYQ
C.数列求值
给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3 项的和。
求第20190324 项的最后4 位数字
分析与过程:
- 与菲波那契数列相关题目有相似 ,不算保留过程值,
- 可以想到直接计算这是一个非常庞大的数字,题目只要最后四位,可以将每次所得结果取模10000
- 可以借用规律,先模运算再相加,所得,等于先相加再模运算
用例代码:
//mymath(20190324);
void mymath(int scale){
long long d1, d2, d3, d4;
d1 = d2 = d3 = 1;
for(int i = 4; i <= scale; i++){
d4 = (d2 + d3 + d1) % 10000;
d1 = d2;
d2 = d3;
d3 = d4;
}
cout << d4 << endl;
}
正确答案:4659
D.数的分解
2019 分解成3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?
注意:交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和 1001+1000+18 被视为同一种。
分析与过程:
1.统计次数,不必求其具体数值,
2. bool函数,将处理结果传回符合则计数量++
用例代码:
bool fun(int num){//判断是否含有2或者4
int temp;
while(num){
temp = num % 10;
if(temp == 2 || temp == 4)
return false;
num = num / 10;
}
return true;
}
void mymath(int scale){
int c , result = 0;
for(int a = 1; a < scale/3; a++){
for(int b = 2; b < scale/2; b++){
c = scale - a- b;
if((c>b) && (b>a)&&fun(c)&&fun(a)&&fun(b))
//三位数各不相同,且都不含有2和4
result ++;
else
continue;
}
}
cout << result ;
}
正确答案:40785
ps:小白上路,欢迎大家多多指正!