【题解】约瑟夫问题2
【题目描述】
M个人围成一圈,每分钟相邻的两个人可以交换位置(只能有一对交换)。求使M个人的顺序颠倒(即每个人左边相邻的人换到右边,右边相邻的人换到左边)所需的最少时间(分钟数)。
【输入描述】
第一行为测试数据的组数n,以后n行中每行为一个小于32767的正整数,表示M
【输出描述】
对于每组测试数据,输出一个数,表示最少需要的分钟数。
【样例输入】
3 4 5 6
【样例输出】
2 4 6
【题目描述】
M个人围成一圈,每分钟相邻的两个人可以交换位置(只能有一对交换)。求使M个人的顺序颠倒(即每个人左边相邻的人换到右边,右边相邻的人换到左边)所需的最少时间(分钟数)。
【输入描述】
第一行为测试数据的组数n,以后n行中每行为一个小于32767的正整数,表示M
【输出描述】
对于每组测试数据,输出一个数,表示最少需要的分钟数。
【样例输入】
3 4 5 6
【样例输出】
2 4 6
【题目描述】
有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合。假设从A方向驶来的火车有n节(n<=1000)。分别按照顺序编号为1,2,3,...n。假定在进入车站前,每节车厢之间都不是连着的,并且它们可以自行移动到B处的铁轨上。另外假定车站C可以停放任意多节车厢。但是一旦进入车站C,它就不能再回到A方向的铁轨上了,并且一旦当它进入B方向的铁轨,它就不能在回到车站C。车厢调度的工作人员需要知道能否使它以a1,a2,...,an的顺序从B方向驶出,请来判断能否得到指定的车厢顺序。
【输入描述】
第一行为一个整数n,其中n<=1000,表示有n节车厢,第二行为n个数字,表示指定的车厢顺序。
【输出描述】
如果可以得到指定的车厢顺序,则输出一个字符串“YES”,否则输出“NO”(注意要大写,不包含引号)
【样例输入】
5 5 4 3 2 1
【样例输出】
YES
【提示】
解析:观察发现,整个调度过程其实是在模拟入栈出栈的过程,而这个过程中,我们可以分成三种状态:栈前、栈中、栈后。我们可以发现,当某个数字出栈了,说明比它小的数字要么已经出栈了,要么还在栈里,不能是入栈前状态,并且在栈中的顺序是从大到小的(从栈顶往栈底看),比如出5,那么1,2,3,4要么已经在5之前出了,要么还在栈中(假如1,3,4在栈中,从栈顶往栈底看依次为4,3,1),不能是入栈前的状态。如果某个数字要出栈,那么当前在栈中的数字都必须小于它,否则就与栈的性质矛盾,不合法,于是我们可以这样解决:
从第一个数字开始扫描,a[i]表示当前出栈的数字,如果有比a[i]大的数字还在栈中,那么就产生矛盾,输出“NO”;否则,标记当前数字a[i]为栈后状态,那么[1, a[i]-1]这些数字如果还没出栈,标记为栈中状态。具体我们可以用0表示为确定状态,1表示栈中状态,2表示栈后状态。
【题目描述】
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。
【输入描述】
第一行两队的人数。
第二行舞曲是数目。
【输出描述】
配对情况。
【样例输入】
4 6 7
【样例输出】
1 1 2 2 3 3 4 4 1 5 2 6 3 1
【题目描述】
从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。
比如,16–9*(4+3)转换成后缀表达式为:16□9□4□3□+*–,在字符数组A中的形式为:
栈中的变化情况:
运行结果:-47
提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在范围内,如有除法保证能整除。
【输入描述】
一个后缀表达式。
【输出描述】
一个后缀表达式的值。
【样例输入】
16 9 4 3 +*-@
【样例输出】
-47
【题目描述】
一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。
【输入描述】
每组数据前有一个N(<1000),表示跟随的整数P(0
【输出描述】
按从小到大的顺序输出非相关数,若没有非相关数,则输出None
【样例输入】
8 213 667 3 213 43 34 677 2 3 322 232 232 0
【样例输出】
2 3 667 677 None
【题目描述】
作为程序猿,最盼望的日子就是每月的9号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵
但是对于公司财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小李最近就在考虑一个问题:如果每个员工的工资额都知道,最少需要准备多少张人民币,才能在给每位员工发工资的时候都不用员工找零呢?
这里假设程序猿的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
【输入描述】
输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示员工的人数,然后是n个员工的工资。
n=0表示输入的结束,不做处理。
【输出描述】
对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。
【样例输入】
3 1 2 3 0
【样例输出】
4
【题目描述】
农夫 John 建造了一座很长的畜栏,它包括N(2<=N<100000)个隔间,这些小隔间依次编号为x1,x2,...xn(0<=xi<=1000000000)。但是,John的C(2<=C<=N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?
【输入描述】
第一行:空格分隔的两个整数N和C;
第二行---第N+1行:i+1行指出了xi的位置。
【输出描述】
        一个整数,最大的最小值。
【样例输入】
5 3 1 2 8 4 9
【样例输出】
3
【提示】
把牛放在1,4,8这样的最小距离是3。