试题 A:组队
本题总分:5分
【问题描述】
作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员,
组成球队的首发阵容。
每位球员担任 1号位至 5号位时的评分如下表所示。请你计算首发阵容 1
号位至5号位的评分之和最大可能是多少?
答案:490
思路:直接手算(注意:1~5号位必须是编号不同的人)
试题 C:数列求值
本题总分:10分
【问题描述】
给定数列1,1,1,3,5,9,17,…,从第4项开始,每项都是前3项的和。求
第20190324项的最后4位数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个4位整数(提示:答案的千位不为0),在提交答案时只填写这个整数,填写
多余的内容将无法得分。
答案:4659
#include <iostream>
using namespace std;
int a[20190325]; // 数组较大时一般要写在主函数外
int main()
{
int i;
a[0]=a[1]=a[2]=1;
for(i=3;i<20190324;i++) {
a[i]=a[i-1]+a[i-2]+a[i-3];
a[i]%=10000; // 没有这句的话数据太大,因为只需求最后4位数字所以可以每次求完一个就取余
}
cout<<a[20190323]%10000<<endl;
return 0;
}
试题 D:数的分解
本题总分:10分
【问题描述】
把 2019分解成 3个各不相同的正整数之和,并且要求每个正整数都不包
含数字2和4,一共有多少种不同的分解方法?
注意交换 3个整数的顺序被视为同一种方法,例如 1000+1001+18和
1001+1000+18被视为同一种。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:40785
#include <iostream>
using namespace std;
bool f(int n)
{
int t;
while(n!=0) {
t=n%10; // 先判断最后一位数(这里要加个变量t,没有则会让n改变,后面无法判断)
if(t!=2&&t!=4) n/=10;
else break;
}
if(n==0) return 1;
else return 0;
}
int main()
{
int a[2020],i,j=0,k,p=0,ans=0;
// 要先筛选符合条件的放于数组中,否则不能输出!
for(i=1;i<2018;i++) {
if(f(i)) {
a[j++]=i;
p++;
}
}
for(i=0;i<p;i++)
for(j=i+1;j<p;j++)
for(k=j+1;k<p;k++) {
if(((a[i]!=a[j])&&(a[i]!=a[k])&&(a[j]!=a[k]))&&((a[i]+a[j]+a[k])==2019)) ans++;
}
cout<<ans<<endl;
return 0;
}
当时没有想到可以直接除法取数...
试题 F:特别数的和
时间限制: 1.0s内存限制: 256.0MB本题总分:15分
【问题描述】
小明对数位中含有 2、0、1、9的数字很感兴趣(不包括前导 0),在1到
40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574。
请问,在1到n中,所有这样的数的和是多少?
【输入格式】
输入一行包含两个整数n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】
40
【样例输出】
574
【评测用例规模与约定】
对于20%的评测用例,1≤n≤10。
对于50%的评测用例,1≤n≤100。
对于80%的评测用例,1≤n≤1000。
对于所有评测用例,1≤n≤10000。
#include <iostream>
using namespace std;
bool f(int n)
{
int t;
while(n) {
t=n%10; // 先判断最后一位数(这里要加个变量t,没有则会让n改变,后面无法判断)
if(t==2||t==0||t==1||t==9) {
return 1; continue;
}
n/=10;
}
if(n==0) return 0;
}
int main()
{
int i,n,ans=0; cin>>n;
for(i=1;i<=n;i++) {
if(f(i)) ans+=i;
}
cout<<ans<<endl;
return 0;
}
试题 H:等差数列
时间限制: 1.0s内存限制: 256.0MB本题总分:20分
【问题描述】
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一
部分的数列,只记得其中N个整数。
现在给出这 N个整数,小明想知道包含这 N个整数的最短的等差数列有
几项?
【输入格式】
输入的第一行包含一个整数N。
第二行包含 N个整数 A1,A2,···,AN。(注意 A1 ∼AN并不一定是按等差数
列中的顺序给出)
【输出格式】
输出一个整数表示答案。
【样例输入】
5
2641020
【样例输出】
10
【样例说明】
包含2、6、4、10、20的最短的等差数列是2、4、6、8、10、12、14、16、
18、20。
【评测用例规模与约定】
对于所有评测用例,2≤N≤100000
#include <iostream>
#include <algorithm>
using namespace std;
int a[100001];
int main()
{
int n,i,ans; cin>>n;
for(i=0;i<n;i++) cin>>a[i];
sort(a,a+n); 头文件为 #include <algorithm>
int d=a[1]-a[0],max=a[0],min=a[0]; // d为公差
for(i=1;i<n-1;i++) {
if(a[i+1]-a[i]<d) d=a[i+1]-a[i];
}
for(i=1;i<n;i++) {
if(a[i]>max) max=a[i];
if(a[i]<min) min=a[i];
}
cout<<(max-min)/d+1<<endl;
return 0;
}
总结:思考时是一个深入的过程,当发现一直做不出来时,尝试换种思路,从头开始。