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 2n 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 赛题训练的主要内容,如果未能解决你的问题,请参考以下文章

CCF-CSP 201612 赛题训练

CCF-CSP 201609 赛题训练

CCF-CSP 201709 赛题训练

CCF-CSP 202203 赛题训练

CCF-CSP 201909 赛题训练

CCF-CSP 201812 赛题训练