CCF-CSP 201712 赛题训练
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF-CSP 201712 赛题训练相关的知识,希望对你有一定的参考价值。
CCF-CSP 201809 赛题训练
【CCF CSP-20171201】最小差值
题意概述
给定 n 个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。
输入输出格式
输入第一行包含一个整数 n。第二行包含 n 个正整数,相邻整数之间使用一个空格分隔。
输出一个整数,表示答案。
数据规模
2 ≤ n ≤ 1000 2\\le n\\le\\ 1000 2≤n≤ 1000,每个给定的整数都是不超过 10000 的正整数。
算法设计
很简单的一道题,先用 sort
函数进行从小到大排序,再利用 adjacent_difference
函数求解相邻两个数差值,最后利用 min_element
函数求出这些差值中的最小值即可。
C++代码
#include <bits/stdc++.h>
using namespace std;
using gg = long long;
int main()
ios::sync_with_stdio(false);
cin.tie(0);
gg ni;
cin >> ni;
vector<gg> v(ni);
for (gg& i : v)
cin >> i;
sort(v.begin(), v.end());
adjacent_difference(v.begin(), v.end(), v.begin());
cout << *min_element(v.begin() + 1, v.end());
return 0;
算法设计2
方法一:暴力法
同样是暴力解决问题,一种是程序先读入数据再进行处理;另外一种是边读入数据边处理,算是一种编程技巧。暴力法的时间复杂度是
O
(
n
2
)
O(n2)
O(n2)。
一般而言,程序中将输入输出逻辑跟计算逻辑分开是好的做法,程序逻辑更加清晰,程序更加易于修改。当输入数据格式发生变化时,修改程序局部化,影响的逻辑范围小,不容易出错。而将输入输出程序逻辑与计算逻辑混在一起,则在修改程序时,影响范围大,容易导致出错。
方法二:排序
对所有数据进行排序后,最小差值的数只可能是相邻的2个数。排序法的时间复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。
相比较而言,排序法似乎时间上更优一些。
/* CCF-CSP201712-1 最小差值 */
#include <stdio.h>
#include <stdlib.h>
#define N 1000
#define MAXA 10000
int a[N];
int main()
int n, i, j;
/* 读入数据 */
scanf("%d", &n);
for (i = 0; i < n; i++) scanf("%d", &a[i]);
/* 计算差值的最小值(暴力法) */
int mind = MAXA;
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
int d = abs(a[i] - a[j]);
mind = d < mind ? d : mind;
/* 输出结果 */
printf("%d\\n", mind);
return 0;
/* CCF-CSP201712-1 最小差值 */
#include <stdio.h>
#include <stdlib.h>
#define N 1000
#define MAXA 10000
int a[N];
int main()
int n, i, j;
/* 读入数据, 计算差值的最小值(暴力法) */
int mind = MAXA;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (j = 0; j < i; j++)
int d = abs(a[i] - a[j]);
mind = d < mind ? d : mind;
/* 输出结果 */
printf("%d\\n", mind);
return 0;
排序算法:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
ll n;
cin >> n;
ll x[n];
for (int i = 0; i < n; i++)
cin >> x[i];
sort(x, x+n);
ll minn = 10000;
for (int i = 1; i < n; i++)
ll c = x[i]-x[i-1];
if (c < minn)
minn = c;
cout << minn << endl;
return 0;
# CCF201712-1 最小差值
n = int(input())
nums = [int(num) for num in input().split()]
nums.sort() # 排序
mind = 10000
for i in range(n - 1):
d = nums[i + 1] - nums[i]
if (d < mind):
mind = d
print(mind)
【CCF CSP-20171201】报数
题目
有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。
游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。
例如,当n=5, k=2时:
1号小朋友报数1;
2号小朋友报数2淘汰;
3号小朋友报数3;
4号小朋友报数4淘汰;
5号小朋友报数5;
1号小朋友报数6淘汰;
3号小朋友报数7;
5号小朋友报数8淘汰;
3号小朋友获胜。
给定n和k,请问最后获胜的小朋友编号为多少?
输入
输入一行,包括两个整数n和k,意义如题目所述。
输出
输出一行,包含一个整数,表示获胜的小朋友编号。
输入样例1
5 2
输出样例1
3
输入样例2
7 3
输出样例2
4
提示
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。
算法思路:
- 设置标记数组:标记是否淘汰
- 设置num:作为报数值
- 设置i:对人数n取余实现报数循环
#include<bits/stdc++.h>
using namespace std;
int main()
int n, k;
cin >> n >> k;
bool s[n];
// memset(s, 1, n); // 初始化
// int a[5]; //c++11新写法
fill(s, s+n, 1); // 初始化
int i = 0, a = n, num = 0;
while (a > 1)
if (s[i%n])
num++; // 报数
if (num % k == 0 || num % 10 == k)
s[i%n] = 0;
a--; // 剩余人数
i++; // 循环学生个数
for (int i = 0; i < n; i++)
if (s[i])
cout << i+1;
break;
加油!
感谢!
努力!
以上是关于CCF-CSP 201712 赛题训练的主要内容,如果未能解决你的问题,请参考以下文章