CCF计算机软件能力认证2021-12真题练习
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF计算机软件能力认证2021-12真题练习相关的知识,希望对你有一定的参考价值。
CCF计算机软件能力认证2021-12
1. 序列查询
题目描述
3 10
2 5 8
15
9 10
1 2 3 4 5 6 7 8 9
45
解题思路
给定n个数,设定最大值N,询问x范围为[0, n],求数组中
<=x的最大下标。
- 第一步思考如何存取数据,都可以,这里采用了边存边用的方式
- 第二步简化问题,给定数组长度 n ,一个数 N ,数组数据一大堆。将 0 放在数组数据开头,将 N 放在数组数据末端,求数组数据每相邻两个数之间的差然后乘以前者数据下标的值最终求和即为答案。这样化简完,就非常简单了,定义三个变量:
- last(记录上一个数据,即相邻两个的第一个)
- now(记录当前读入数据,即相邻两个的第二个)
- end(最终结果)
由于采用边存边用,则可以将 last 的初始值设为 0 ,即将“0”放入数组开头,当到达末端时将now设置为 N ,即将 N
放入数组末端,即可实现。
#include<stdio.h>
int main()
int n, N;
scanf("%d%d", &n, &N);
int i, last = 0, now, end = 0;
for (i = 0; i < n; i++)
if (i==n)
now = N;
else
sacnf("%d", &now);
end += (now-last)*i;
last = now;
printf("%d", end);
return 0;
python:
n, N = map(int, input().split())
#两个正整数n, N,分别代表n件商品,N代表最大预算
price = [i for i in map(int, input().split())]
#输入n 个用空格分隔的整数 A1,A2,⋯,An
num = 1
sum = 0
for i in range(1, len(price)):
sum += (price[i]-price[i-1])*num
num += 1
if N>price[n-1]:
sum += (N-price[n-1])*num
print(sum)
2. 序列查询新解
3 10
2 5 8
5
样例解释:
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
f(i) | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 |
g(i) | 0 | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 |
|g(i)−f(i)| | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
根据题意新增g(x)=i//r:x整除r=N/(n+1)
,每次计算abs(f(i)-g(i))
Python:
n, N = map(int, input().split())
nums = [i for i in map(int, input().split())]
r = N//(n+1)
f = [0 for i in range(N+1)]
for x in nums:
f[x] = 1
sum = 0
for i in range(1,N):
if f[i]==1:
f[i] = f[i-1]+1
else:
f[i] = f[i-1]
sum += abs(i//r-f[i])
print(sum)
C++:
#include<bits/stdc++.h>
using namespace std;
int main()
int n, N;
cin >> n >> N;
int last = 0, now, sum = 0;
int f[N]=0, c; // 数组一定要初始化
for (int i = 1; i <=n ;i++)
cin >> c;
f[c] = 1; // 确认存在
int r = floor(N/(n+1));
for (int i = 1; i < N; i++)
if (f[i] == 1)
f[i] = f[i-1]+1;
else
f[i] = f[i-1];
sum += abs(floor(i/r)-f[i]);
cout << sum << endl;
加油!
感谢!
努力!
以上是关于CCF计算机软件能力认证2021-12真题练习的主要内容,如果未能解决你的问题,请参考以下文章