绍兴市第七届青少年编程复赛题目(2008)

**01:**明明的随机数

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了试验的客观性,他先用计算机生成N个1到1000之间的随机整数(N<=100),对其中重复的数字,只保留一个,把其余相同的去掉。不同的数对应着不同的学生学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成"去重"和"排序"的工作。

输入

有两行,第1行为1个正整数,表示所生成的随机数的个数N;第2行有N个用空格隔开的正整数,为所产生的随机数。

输出

也有两行,第1行为1个正整数M,表示不同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

样例输入 复制
10
20 40 32 67 40 20 89 300 400 15
样例输出 复制
8
15 20 32 40 67 89 300 400

代码

cpp 复制代码
#include<iostream>
using namespace std;
int main(){
    bool a[1001]={};
    int b,n,cnt=0;
    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>b;
    	a[b]=1;
	}
	for(int i=1;i<=1000;i++){
		if(a[i]==1)cnt++;
	}
	cout<<cnt<<endl;
	for(int i=1;i<=1000;i++){
		if(a[i]==1)cout<<i<<" ";
	}
	return 0;
}

02:尼科梅彻斯定理

题目描述

任何一个正整数n的立方都可以写成n个连续奇数之和, 这就是著名的尼科梅彻斯定理。

例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

现在当 n 给出之后,请你按从小到大的顺序输出这一串连续的奇数 。

输入

只有一 行,一个正整数 n。 (n<1000)

输出

只有一行, 符合要求的 一串连续的奇数, 各数间只能用一空格隔开,行尾不能有多余的空格和回车。

样例输入 复制
4
样例输出 复制
13 15 17 19

代码

cpp 复制代码
#include<iostream>
using namespace std;
int main(){
	int n,p;
	cin>>n;
	int a[n];
	p=n*n;
	if(p%2==1){
		for(int i=n*n-n+1;i<=n*n+n;i+=2){
			cout<<i<<" ";
		}
	}else{
		for(int i=n*n-n+1;i<=n*n+n-1;i+=2){
			cout<<i<<" ";
		}
	}
	return 0;
}

03:喝醉的狱卒

题目描述

在一所监狱里有一条长长的走廊,沿着走廊排列着n个牢房。每个牢房有一个囚犯,而且房门都是锁着的。

一天晚上,狱卒觉得无聊,于是他决定玩一个游戏。第一轮,他喝了一口威士忌,然后沿着走廊,将所有牢房的门打开 。第二轮,他又喝了一口威士忌.然后又沿着走廊,将所有编号为2的倍数的牢房锁上 。三轮,他再喝一口 威士忌,再沿着走廊,视察所有编号为3的倍数的牢房。如果牢房是 锁着的,他就把它打开;如果牢房是开着的,他就把他锁上。 他如此玩了 n 轮后, 喝下最后一 口威士忌, 醉倒了。 当他醉倒后 , 一些犯人发现他们的牢房开着而且狱卒己经无能为力,他们立刻逃跑了。现给出走廊上牢房的数目,请你确认有多少犯人逃出了监狱。

输入

只有一行,为一个不大 于100000的整数,表示牢房的数目 n。

输出

只有一行,一个整数,表示逃跑的犯人的数目 。

样例输入 复制
5
样例输出 复制
2

代码

cpp 复制代码
#include<iostream>
using namespace std;
int main(){
	int n,cnt=0;
	cin>>n;
	bool a[n+1]={};
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j+=i){
			a[j]=!a[j];
		}
	}
	for(int i=1;i<=n;i++){
		if(a[i]==1){
			cnt=cnt+1;
		}
	}
	cout<<cnt;
	return 0;
}

04:3n+1数链问题

题目描述

在计算机科学上, 有很多类问题是无法解决的,我们称之为不可解决问题。然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可解决。

现在我们就有这样一个问题,问题如下:

(1) 输入一个正整数 n;

(2) 把 n 显示出来;

(3) 如果 n=1则结束;

(4) 如果 n 是奇数则 n 变为 3*n+1 ,否则 n 变为 n/2;

(5) 转入 (2) 步.

例如对于输 入的正整数 22,应该有如下 数列被显示 出来:

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

我们推测:对于任意一个正整数,经过以上算法最终会推到 1 。尽管这个算法很简单,但我们仍然无法确定我们的推断是否正确。不过好在我们有计算机, 我们验证了对于小于1000000的正整数都满足以上推测。

对于给定的正整数n,我们把显示出来的数的个数定义为n的链长,例如22的链长为16.

你的任务是编写一个程序,对于任意一对正整数 i 和 j , 给出 i 与 j 之间的最长链长,当然这个最长链长是由 i 与 j 之间的其中一个正整数产生的。我们这里的 i 和 j 既包 括 i 也包括 j 。

输入

只有一 行,二个正整数 i 和 j , i 和 j 之间 以一个空格隔开。 0<i<=j<1000 。

输出

只有一行, 一个正整数 , 即为 i 与 j 之间的最长链长。(最长链长保证在 150 以内)

样例输入 复制
1 10
样例输出 复制
20

代码

cpp 复制代码
#include<iostream>
using namespace std;
int main(){
	int i,j,n,cnt=0,max=0;
	cin>>i>>j;
	for(int a=i;a<=j;a++){
		cnt=1;
		n=a;
		while(n!=1){
			if(n%2==1){
				n=n*3+1;
				cnt++;
			}else{
				n=n/2;
				cnt++;
			}
			
		}
		if(max<cnt){
			max=cnt;
		}
	}
	cout<<max;
	return 0;
}
相关推荐
mana飞侠4 分钟前
代码随想录算法训练营第59天:动态[1]
开发语言·数据结构·算法·动态规划
每天的积累5 分钟前
C++学习笔记二
c++·笔记·学习
zengy58 分钟前
代码随想录打卡第十三天
数据结构·c++·算法·leetcode
野草y34 分钟前
数据结构(3.2)——栈的顺序存储实现
数据结构
Danica~44 分钟前
RpcChannel的调用过程
网络·c++·rpc
C_player_0011 小时前
C++ list的模拟实现
c++
yannan201903132 小时前
【算法】(C语言):二分查找
c语言·算法
zhangbin_2372 小时前
【Python机器学习】处理文本数据——将文本数据表示为词袋
人工智能·python·算法·机器学习·分类
孑渡2 小时前
【LeetCode】每日一题:跳跃游戏
python·算法·leetcode·游戏·职场和发展
liulanba2 小时前
leetcode--二叉树中的最长交错路径
linux·算法·leetcode