logo资料库

CCF CSP 2017.12 第12次题目答案代码.docx

第1页 / 共27页
第2页 / 共27页
第3页 / 共27页
第4页 / 共27页
第5页 / 共27页
第6页 / 共27页
第7页 / 共27页
第8页 / 共27页
资料共27页,剩余部分请下载后查看
CCF201712-1 最小差值(100分)
CCF201712-2 游戏(100分)【模拟】
CCF201712-3 Crontab(100分)【模拟+文本处理】
CCF201712-1 最小差值(100 分) 201712-1 最小差值 1.0s 256.0MB 问题描述 给定 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 的正整数。 问题分析:
根据题意,这是一个求所有数差值最小的问题。 有两种方法可以解决,一是用暴力法;二是先对所有数据进行排序, 然后求相邻数差值的最小值(变成求最值问题)。 程序说明: 绝对值函数 abs()要使用 stdlib.h 库中的函数。 求最小值的初值要设置成最大值,原题中指出数最大值为 10000,所 以初值取 10000 即可。 提交后得 100 分的 C++语言程序(排序)如下: /* CCF201712-1 最小差值 */ #include #include using namespace std; const int N = 1000; const int N2 = 10000; int a[N]; . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . int main() { int n; // 读入数据 cin >> n; for(int i=0; i> a[i]; // 排序 sort(a, a + n); // 计算差值的最小值 int min = N2; for(int i=1; i
cout << min << endl; return 0; } . . . . . 提交后得 100 分的 C++语言程序(暴力法)如下: /* CCF201712-1 最小差值 */ #include #include using namespace std; const int N = 1000; const int N2 = 10000; int a[N]; int main() { int n; // 读入数据 cin >> n; for(int i=0; i> a[i]; // 计算差值的最小值(暴力法) int min = N2; for(int i=0; i
return 0; } CCF201712-2 游戏(100 分)【模拟】 试题 编号: 201712-2 试题 名称: 游戏 时间 限制: 1.0s 内存 限制: 256.0MB
问题描述 有 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。 问题分析:
这是一个模拟题,关键在于数据表示。 另外,使用模除可以实现循环,即下标的循环。这是程序中经常用 的技术。 程序说明: 方法一: 使用数组进行模拟,flag[]用于标记小朋友是否出局, flag[i]=false 表示 i+1 号小朋友没有出局,flag[i]=true 表示 i+1 号 小朋友已经出局。 程序中的其他做法都是套路。 方法二: 使用 STL 的向量 vector 进行模拟。 方法三: 使用 STL 的队列 queue 进行模拟。 提交后得 100 分的 C++语言程序(方法三)如下:
/* CCF201712-2 游戏 */ #include #include #include using namespace std; int main() { int n,k; queue q; // 读入数据与队列初始化 scanf("%d%d",&n,&k); for(int i=1; i<=n; i++) q.push(i); // 模拟出局过程 int no=0, head; while(!q.empty()) { head = q.front(); q.pop(); no++; if(no % k == 0 || no % 10 == k) ; else q.push(head); } printf("%d\n", head); return 0; } 提交后得 100 分的 C++语言程序(方法二)如下: /* CCF201712-2 游戏 */ #include #include
分享到:
收藏