noip2018普及组初赛试题c++

                       noip2018普及组初赛试题c++

一、单项选择题       


1. 以下哪一种设备属于输出设备:()

A. 扫描仪     

B. 键盘   

C. 鼠标    

D. 打印机    

2. 下列四个不同进制的数中,与其它三项数值上不相等的是(  )。

A. (269)16

B. (617)10

C. (1151)8

D. (1001101011)2

3. 1MB 等于(   )。

A. 1000 字节

B. 1024 字节

C. 1000 X 1000 字节                              

D. 1024 X 1024 字节

4. 广域网的英文缩写是(  )。

A. LAN

B. WAN

C. MAN

D. LNA

5. 中国计算机学会于(  )年创办全国青少年计算机程序设计竞赛。

A. 1983

B. 1984

C. 1985

D. 1986

6. 如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照CapsLock、字母键 A、字母键 S、字母键 D、字母键 F 的顺序循环按键,即 CapsLock、A、 S、D、F、CapsLock、A、S、D、F、……,屏幕上输出的第 81 个字符是字母

(  )。

A. A   

B. S      

C. D      

D.   a

7. 根节点深度为 0,一棵深度为 h 的满 k(k>1)叉树,即除最后一层无任何子节点外,每一层上的所有结点都有 k 个子结点的树,共有(  )个结点。

A. (k ^(h+1) - 1) / (k - 1)

B. k^h-1

C. k^h

D. (k ^(h+1)) / (k - 1)

8. 以下排序算法中,不需要进行关键字比较操作的算法是(  )。

A. 基数排序

B. 冒泡排序

C. 堆排序

D. 直接插入排序

9. 给定一个含 N 个不相同数字的数组,在最坏情况下,找出其中最大或最小的数,至少需要 N - 1 次比较操作。则最坏情况下,在该数组中同时找最大与最小的数至少需要(  )次比较操作。(⌈ ⌉表示向上取整,⌊ ⌋表示向下取整)

A. ⌈3N / 2⌉ - 2  

B. ⌊3N / 2⌋ - 2

C. 2N - 2

D. 2N - 4

10. 下面的故事与(   )算法有着异曲同工之妙。

从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:‘从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事……’”

A. 枚举    

B. 递归      

C. 贪心      

D. 分治

11. 由四个没有区别的点构成的简单无向连通图的个数是(  )。

A. 6

B. 7

C. 8

D. 9

12. 设含有 10 个元素的集合的全部子集数为 S,其中由 7 个元素组成的子集数为T,则 T / S 的值为(  )。

A. 5 / 32

B. 15 / 128

C. 1 / 8

D. 21 / 128

13. 10000 以内,与 10000 互质的正整数有(  )个。

A. 2000

B. 4000

C. 6000

D. 8000

14.为了统计一个非负整数的二进制形式中 1 的个数,代码如下:

int CountBit(int x) 
 { 
 	int ret = 0;  
	
    while (x) 
 	{ 
 	    ret++; 
 	    ___________; 
 	} 

 	return ret; 
} 	

则空格内要填入的语句是(  )。

A. x >>= 1

B. x &= x - 1

C. x |= x >> 1

D. x <<= 1

15.下图中所使用的数据结构是(   )。

A. 哈希表

B. 栈   

C. 队列      

D. 二叉树

  • 问题求解


  1. 甲乙丙丁四人在考虑周末要不要外出郊游。 已知

①如果周末下雨,并且乙不去,则甲一定不去;

②如果乙去,则丁一定去;

③如果丙去,则丁一定不去;

④如果丁不去,而且甲不去,则丙一定不去。

如果周末丙去了,则甲___去了_____(去了/没去),乙_____没去___(去了/没去),丁____没去____(去了/没去),周末___没下雨_____(下雨/ 没下雨)。

2.从1到2018这2018个数中,共有_____544_____个包含数字8的数。包含数字8的数是指有某一位是“8”的数,例如“2018”与“188”。

  • 阅读程序


1.

#include<cstdio>
char st[100];
int main(){
	scanf("%s",st);
	for(int i = 0; st[i]; ++i){
		if( 'A' <= st[i] && st[i] <= 'Z')
			st[i] = 1;
	}
	printf("%s\n",st);
	return 0;
}

输入: QuanGuoLianSai

            RuanHuoMianTai

输出:                                                    

2.

#include<cstdio>
char st[100];
int main(){
	int x;
	scanf("%d",&x);
	int res = 0;
	for(int i = 0; i<x ; ++i ){
		if(i * i % x == 1){
			++ res;
		}
	}
	printf("%d",res);
	return 0;
}

输入: 15

输出:                           

3.

#include <iostream>
using namespace std;
int n,m;
int findans( int n,int m){
	if(n==0) return m;
	if(m==0) return n%3;
	
	return findans(n-1,m)-findans(n,m-1)+findans(n-1,m-1);
}
int main(){
	cin>> n>> m;
	cout<<findans(n,m)<<endl;
	return 0;
}

输入: 5 6

输出:        8                    

4.

#include<cstdio>
int n,d[100];
bool v[100];
int main(){
	scanf("%d",&n);
	for(int i=0; i<n; ++i){
		scanf("%d",d+i);
		v[i] = false;
	}
	int cnt = 0;
	for(int i=0; i<n; ++i){
		if(!v[i]){
			for(int j=i; !v[j]; j=d[j]){
				v[j] = true;	
			}
			++cnt;
		}
	}
	printf("%d\n",cnt);
	return 0;
}

输入: 10 7 1 4 3 2 5 9 8 0 6

输出:                          

  • 完善程序题


1.

(最大公约数之和)下列程序想要求解整数𝑛的所有约数两两之间最大公约 数的和对10007求余后的值,试补全程序。

举例来说,4的所有约数是1,2,4。1和2的最大公约数为1;2和4的最大公约数为2;1和4的最大公约数为1。于是答案为1 + 2 + 1 = 4。  要求 getDivisor 函数的复杂度为𝑂函数的复杂度为𝑂(log max(𝑎, 𝑏))。

#include <iostream>  
using namespace std;  
const int N = 110000, P = 10007;
int n;  int a[N], len; int ans; 
void getDivisor() { 
    len = 0;
    for (int i = 1;   ___(1)___  <= n; ++i) 
        if (n % i == 0) { 
            a[++len] = i; 
            if (  ____(2)____   != i) 
                a[++len] = n / i; 
        } 
}
int gcd(int a, int b) {
        if (b == 0) {
             ____(3)____    ; 
        } 
    return gcd(b,    ____(4)____ ); 
} 
int main() 
{  
    cin >> n;   
    getDivisor();  
    ans = 0; 
    for (int i = 1; i <= len; ++i) { 
        for (int j = i + 1; j <= len; ++j) { 
            ans = (    ____(5)____    ) % P; 
        } 
    }
    cout << ans << endl; 
    return 0;
}

 (  1  )______i * i________________________    

 (  2  )______n / i________________________

 (  3  )______return  a____________________

 (  4  )______a % b______________________

 (  5  )______ans + gcd ( a [ i ] , b [ j ] )_______

2. 

对于一个1到𝑛的排列𝑃(即1到𝑛中每一个数在𝑃中出现了恰好一次),令𝑞𝑖为  第𝑖个位置之后第一个比𝑃𝑖值更大的位置,如果不存在这样的位置,则𝑞𝑖 = 𝑛 + 1。  举例来说,如果𝑛 = 5且𝑃为1 5 4 2 3,则𝑞为2 6 6 5 6。

下列程序读入了排列𝑃,使用双向链表求解了答案。试补全程序。(  数据范围 1 ≤ 𝑛 ≤ 10^5。)

#include <iostream>
using namespace std;
const int N = 100010; 
int n;  int L[N], R[N], a[N]; 
int main() { 
    cin >> n;      
    for (int i = 1; i <= n; ++i){
        int x; 
        cin >> x; 
          ____(1)____   ;
    } 
    for (int i = 1; i <= n; ++i){ 
        R[i] =  ____(2)____  ;
        L[i] = i - 1; 
    }
    for (int i = 1; i <= n; ++i){ 
        L[ ____(3)____ ] = L[a[i]]; 
        R[L[a[i]]] = R[ ____(4)____  ]; 
    } 

    for (int i = 1; i <= n; ++i) { 
        cout <<    ____(5)____    << " "; 
    } 

    cout << endl; 
    return 0; 
}

 (  1  )______a [ x ] = i _________   

 (  2  )______i + 1_____________

 (  3  )______R [ a [ i ] ]_________

 (  4  )______a [ i ]_____________

 (  5  )______R [ i ]_____________

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值