- 29
- 0
- 约3.42千字
- 约 7页
- 2017-03-05 发布于重庆
- 举报
NOIP普及组模拟试题及解答(C语言)二
一、栈(NOIP2003)
【问题描述】
宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n。
现在可以进行两种操作,
1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作)
2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作)
使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由1 2 3生成序列2 3 1的过程。(原始状态如上图所示)
你的程序将对给定的n,计算并输出由操作数序列1,2,…,n经过操作可能得到的输出序列的总数。
【输入】
由文件stack.in给出输入数据,输入文件只含一个整数n(1≤n≤12)
【输出】
输出文件stack.out只有一行,即可能输出序列的总数目。
【样例】
stack.in stack.out 3 5
二、传球游戏(NOIP2008)
【问题描述】
上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。
游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。
聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次后又回到小蛮手里。两种传球方法被视为不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1-2-3-1和1-3-2-1,共有2种。
【输入】
输入文件ball.in共有一行,有两个用空格隔开的整数n,m(3≤n≤30,1≤m≤30)。
【输出】
输出文件ball.out共有一行,有一个整数,表示符合题意的方法数。
【输入输出样例】
ball.in ball.out 3 3 2 【限制】
40%的数据满足:3≤n≤30,1≤m≤20
100%的数据满足:3≤n≤30,1≤m≤30
三、数的划分问题(noip2001)
【问题描述】
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5; 1,5,1; 5,1,1你的程序将对给定的n和k,计算有多少种不同的分法并输出。
【输入】
由文件count.in给出输入数据,输入文件有两个整数n和k (6n=200,2=k=6)。
【输出】
输出文件count.out只有一行,即输出不同的分法。
【样例】
count.in count.out 7 3 4
0≤i n,0≤j n,|Ai,j| 104)都是整数。我们定义一个在第i(0≤i n)行的旋转操作:就是把这一行的每一个元素向右移动一位,最右边的元素移到最左边的位置。如下图:
你可以在任意行做任意多次旋转操作,那么一定存在一个状态,使得所有列的和的最大值是最小,求这个最小值max0=j n{Cj|Cj=Σ0=i nAi,j}。
【输入格式】
第一行一个整数n,接下来n行,每行n个整数来描述矩阵A。
【输出格式】
一个整数,即所有状态中列的和的最大值的最小,输出这个最小值。
【样例】
matrix.in matrix.out 2
4 6
3 7 11
程序样例
一、栈
#include fstream
using namespace std;
ifstream fin(stack.in);
ofstream fout(stack.out);
int n,tot;
void search(int tp,int r)//栈首指针为tp,当前准备入栈的操作数为r
{if (r==n+1)
{tot++;
return;
}
if (tp!=0)//当栈不为空时
search(tp-1,r);
search(tp+1,r+1);
}
int main()
{finn;
tot=0;
search(0,1);
fouttot;
return 0;
}
二、传球游戏(NOIP2008)
#include fstream
using namespace std;
ifstream fin(ball.in);
ofstream fout(ball.out);
int m,n,ans;
void search(int k,int p)//第k次传球,把球传给了第p个人
{if (k==m)
{if (p==0) ans++;
return;
原创力文档

文档评论(0)