1. 首页
  2. 行业
  3. 教育
  4. 2020年csp j入门级复赛真题.docx

2020年csp j入门级复赛真题.docx

上传者: 2024-08-17 18:46:20上传 DOCX文件 30.41KB 热度 13次

CSP信息学奥赛入门级复赛真题解析将对2020年CSP-J入门级复赛真题进行详细解析,涵盖题目描述、标签、部分内容等方面。对于热衷于信息学竞赛的学生,这些真题解析不仅可以帮助他们理解题目的设计思路,还能提高他们的编程能力。题目1:优秀的拆分(power)

题目描述:一般来说,一个正整数可以拆分成若干个正整数的和。1=1,10=1+2+3+4等。对于正整数n的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下,n被分解为了若干个不相同的2的正整数次幂。

输入格式:输入文件名为power.in。输入文件只有一行,一个正整数n,代表需要判断的数。

输出格式:输出文件名为power.out。如果这个数的所有拆分中,存在优秀的拆分,那么你需要从大到小输出这个拆分中的每一个数,相邻两个数之间用一个空格隔开。

样例1输入:6

样例1输出:4 2

样例1解释:6=4+2=2^2+2^1是一个优秀的拆分。

数据范围与提示:对于20%的数据,n<=10。对于另外20%的数据,保证n为奇数。对于另外20%的数据,保证n为2的正整数次幂。对于80%的数据,n<=1024。对于100%的数据,1<=n<=1x10^7。

题目解析:一个数本来就可以拆分成2的正整数次幂,因为利用它的二进制即可得到。例如:6的二进制是110,分别代表2^2,2^1,所以6可以看成2^2+2^1=4+2。对n进行二进制分解,然后倒序输出即可。

参考程序:


#include<iostream>

#include<cstdio>

#include<cmath>

using namespace std;

int n;

int main(){

    cin >> n;

    if (n % 2 == 1) { 

        cout << -1; 

        return 0; 

    }

    int a[30], cnt = 0;

    int base = 1;

    while (n) {

        if (n % 2 == 1) { 

            a[++cnt] = base; 

        }

        n /= 2;

        base *= 2;

    }

    for (int i = cnt; i >= 1; i --) { 

        cout << a[i] << " "; 

    }

    return 0;

}

cmath>cstdio>iostream>

零一点评:本题难度显著高于2019,2018,2017年的第一题。没有联想到二进制转化的同学可能会被卡住。一旦联想到,就是一个入门级题目。

骗分方法

  • 第一个20%:对每个n,打表

  • 第二个20%:根据题意,不存在,直接输出-1

  • 第三个20%:它的拆分就是它本身,直接输出n本身。

若您对信息学竞赛有更深入的兴趣,建议参考《ACM编程算法艺术与信息学竞赛题目完全解析》等相关书籍,进一步提高您的编程水平。

题目2:直播获奖(live)

题目描述:NO12130即将举行。为了增加观赏性,CCF决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为w%,即当前排名前w%的选手的最低成绩就是即时的分数线。

输入格式:输入文件名为live.in。第1行两个正整数n,w,分别代表选手总数与获奖率。第2行有n个非负整数,依次代表逐一评出的选手成绩。

输出格式:输出文件名为live.out。只有一行,包含n个非负整数,依次代表选手成绩逐一评出后,即时的获奖分数线。相邻两个整数间用一个空格分隔。

样例1输入:10 60 20

样例1输出:20 20

数据范围与提示:无特殊限制。

这两个题目涵盖了基本的编程概念和算法思想,适合入门级选手练习和提高编程能力。如果您希望更全面地了解信息学竞赛的题目解析与解法,您可以参考《信息学题目代码答案.rar》以及《算法艺术与信息学竞赛题目完全解析.pdf》,这些资料将为您提供更详尽的学习指导。

下载地址
用户评论