【CCF2017】真题持续更新

  • Post author:
  • Post category:其他


最小差值

问题描述

问题描述

给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。

输入格式

输入第一行包含一个整数n。

第二行包含n个正整数,相邻整数之间使用一个空格分隔。

输出格式

输出一个整数,表示答案。

样例输入

5

1 5 4 8 20

样例输出

1

样例说明

相差最小的两个数是5和4,它们之间的差值是1。

样例输入

5

9 3 6 1 3

样例输出

0

样例说明

有两个相同的数3,它们之间的差值是0.

数据规模和约定

对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。

分析

很简单,排序然后 后一个-前一个 找到最小的就行了


游戏

问题描述

有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,意义如题目所述。

输出格式

输出一行,包含一个整数,表示获胜的小朋友编号。

样例输入

5 2

样例输出

3

样例输入

7 3

样例输出

4

数据规模和约定

对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。

分析

很像约瑟夫环,不过这个报数是连续的,不用重新从1开始

用数组模拟游戏过程就可以,当淘汰人数==n-1的时候循环停止。

一开始90,是没有考虑k==1的情况,这个时候内部的for循环整个都走完了,需要额外加一个break判断

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cctype>
using namespace std;
const int maxx = 1000;
int kids[maxx + 5];
int main()
{
    int n, k;
    while (cin>>n>>k)
    {
        for (int i = 1; i <= n; i++)kids[i] = 1;
        int out = 0,num = 1;
        while (out<n-1)
        {
            for (int i = 1; i <= n; i++)
            {
                if (kids[i]) 
                { kids[i] = num; 
                if (num%k == 0 || num % 10 == k) { kids[i] = 0; out++; }
                num++; }
                if (out == n - 1)break;
            }
        }
        for (int i = 1; i <= n; i++)
            if (kids[i])printf("%d\n", i);

    }
}



版权声明:本文为BeforeEasy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。