[翻译]ACMer 2013 Daily Training- 15th Mar for 11x&&12x

这篇博客涵盖了多道编程竞赛题目,包括计算最大朋友集团数、理解Bob和Alice的编码策略、寻找最快到达指定楼层的电梯路径、分析斐波那契数列的递归调用次数、计算特定玩家赢得游戏的概率、找到城市中噪音最低的路径、实现大整数加法以及解决定点排列问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[A] Friends

有一个镇有N个居民。当然其中有许多人是朋友的关系。根据有名的谚语:「我朋友的朋友也是我的朋友」,所以如果A和B是朋友,B和C是朋友,那么A和C也是朋友。

你的任务是算出在这个镇中最大的朋友集团为多少人。

Input

输入的第一列有一个正整数,代表以下有多少组测试资料。

每组测试资料的第一列有2个正整数N 和M 。N代表镇上居民的数目(1 <= N <= 30000 ),M 代表这些居民中朋友关系的数目( 0 <= M <= 500000)。接下来的M列每列有2个整数A,B( 1 <= A,B <= N , A不等于B),代表A,B为朋友关系。这M列中可能有的会重复出现。

请参考Sample Input。

Output

对每组测试资料输出一列,在这个镇中最大的朋友集团为多少人。

Sample InputSample Output


3 2 
1 2 
2 3 
10 12 
1 2 
3 1 
3 4 
5 4 
3 5 
4 6 
5 2 
2 1 
7 10 
1 2 
9 10 
8 9


6















[B] Cipher

Bob和Alice开始使用一种全新的编码策略。令人讶异的他们并未采用公开金钥密码系统(Public Key Cryptosystem),而是采用秘密键(secret keys)的方式来编码及解码。在1996年2月16日在费城他们上次见面的时候,他们选定了他们的秘密键。这些秘密键是由1到n的整数所构成,但是排列的顺序却是他们任意挑选的。在编码的时候采用以下的原则:

把要编码的讯息(明文)写在秘密键下面,每个字元与秘密键的一数字对齐。位于位置i的字元经编码后其位置为a i,a i为秘密键中第i个位置的值。明文中的每个字元编码后就得到密文了。这密文还可以用同样的策略再加密,经过了k次加密后他们交换他们的密文。

明文的长度一定小于等于n。如果明文的长度小于n,就在其后方加上空白字元使得其长度刚好为n。你的任务是帮助Bob和Alice写一个程式读入秘密键,以及k,以及一连串要加密的明文,然后输出密文。

Input

输入含有多组测试资料,每组测试资料的第一列有一个整数n(0 < n <= 200),代表秘密键的长度。接下来的一列为秘密键,含有n个整数,内容为1到n的某种排列。再接下来的每列为k与明文,其中以一空白字元分隔。请注意:每列以换列符号(End of Line)当作结束,但是换列符号不列入明文。当遇到k=0的一列时代表此组测试资料结束。另外,k可能相当大(但是不会超出C语言中int的范围),所以请注意你程式的演算法,否则可能导致Time Limit Exceeded.

当遇到n=0时代表整个输入结束。请参考Sample Input。

Output

对每一组测试资料中的每列明文,输出加密后的密文(长度一定为n)。每组测试资料后请空一列。请参考Sample Output。

Sample Input

10
4 5 3 7 2 8 1 6 10 9
1 Hello Bob
2 Hello Bob
1995 CERC
0
5
1 2 3 5 4
1 Hello
0
0

Sample Output

BolHeol b
lelBo Hob 
C RCE     

Helol

[C] - Lift Hopping

有一栋摩天大楼,其楼层不会超过100层(编号从0~99)。这栋大楼有n (1 <= n <= 5)部电梯以不同的速度在某些楼层之间移动。第i部电梯在相邻楼层移动需要T i秒(1 <= T i <= 100),不过每部电梯不是每楼都有停,所以有可能某层楼都没有电梯可以到达。

现在你位于第0 层,你想要尽快的到第k 层。有以下几项条件要注意:

  1. 假设你不需等待电梯(也就是说当你在某一层时,假如某部电梯该层有停,那它已经打开门在等你了)。
  2. 在某楼层从这部电梯换到另一部电梯的时间都是一分钟(当然这2部电梯该楼都有停)。
  3. 你不可以走楼梯,一定要搭电梯。
  4. 只有你一个人搭电梯,所以只要你不想要,你可以不停某些楼层。

你的任务是算出从第0层要到第k层,所要花的时间最少是多少?(所谓到达第k层,是指电梯有停在第k层。如果只是在电梯中,通过第k层而没有停,那不算是到达第k层)

Input

输入含有多笔测资,每笔测资输入说明如下:

第一列有2个整数,n 和k。

接下来的一列有n个整数,代表T 1 , T 2 , ..., T n

接下来有n 列,每列代表一部电梯有停的楼层。请参考Sample Input。

Output

对于每笔测资输出从第0层要到第k层,所要花的时间最少是多少?如果不可能,请输出IMPOSSIBLE

Sample InputSample Output
2 30
10 5
0 1 3 5 7 9 11 13 15 20 99
4 13 15 19 20 25 30
2 30
10 1
0 5 10 12 14 20 25 30
2 4 6 8 10 12 14 22 25 28 29
3 50
10 50 100
0 10 30 40
0 20 30
0 20 50
1 1
2
0 2 4 6 8 10
275
285
3920
IMPOSSIBLE










输入范例说明:

第一笔测资:坐电梯1到13楼(130秒),花60秒换到电梯2,然后坐到30楼(85秒),所以总共:130+60+85=275秒。

第二笔测资:坐电梯1到10楼,换到电梯2,然后坐到25楼,然后又换到电梯1,然后坐到30楼,所以总共:10*10+60+15*1+ 60+5*10=285秒。

第三笔测资:坐电梯1到30楼,换到电梯2,然后坐到20楼,然后换到电梯3,坐到50楼所以总共:10*30+60+10*50+60+30 *100=3920秒。

第四笔测资:无法坐到第1层楼。

[D] How Many Calls?

费费伯那西数列(fibonacci number)定义如下:

  • fib(0) = 0
  • fib(1) = 1
  • fib(n) = fib(n-1) + fib(n-2)

但是我们现在并没有兴趣去求第n个费伯那西数是多少。我们想要知道当我们要求第n 个费伯那西数时,要呼叫以上的递回多少次。由于这个数可能会很大,我们想让你的任务简单一些。我们仅仅需要知道最后一个数字是多少就可以了,在这里这个数是以 b进位来表示。

例如:要求出fib(10) 必须呼叫以上的递回177 次(十进位),若b=10的话,那你的答案应该是7。但是若b=8的话,那你的答案应该是1。但是若b=99的话,那你的答案应该是78。

Input

输入含有多组测试资料。每组测试资料一列含有2个整数n(0 <= n <2 63 -1)和b(0 < b <= 10000)。

若n=0 且b=0,代表输入结束。

Output

对每组测试资料输出一列,先输出这是第几组测试资料,然后输出n 和b,最后输出总共要呼叫递回多少次(只要输出以b 进位表示的最后一位的数字)。输出格式请参考Sample Output。

Sample InputSample Output
0 100
1 100
2 100
3 100
10 1000
10 10
10 99
10 8
123456789 9999 
0 0
Case 1: 0 100 1
Case 2: 1 100 1
Case 3: 2 100 3
Case 4: 3 100 5
Case 5: 10 1000 177
Case 6: 10 10 7
Case 7: 10 99 78
Case 8: 10 8 1
Case 9: 123456789 9999 9888

[E] What is the Probability?

这是一个计算机率的问题:有一群人玩掷骰子的游戏(一般的骰子有6面,但是你不可以假设本问题的骰子一定是一般的骰子。)假如某一个人掷出一个骰子出现某一个事件(比如说得到3或者绿色面朝上......等等),我们就说这一个人赢了。

可能有N个人参与此游戏,所以首先由第1个人先掷骰子,再来是第2个人,第3个人,.....然后轮到第N个人,接着又轮回第1个人。当有某一个人掷出某一特定事件时,他就赢了游戏,并且游戏结束。你的任务就是要求出某一个人(第I个人)赢得游戏的机率。

Input

输入的第1列有一个整数S(S<=1000),代表以下有几组测试资料。接下来的S列每列一组测试资料,包含有3个数。第1个数为一个整数N(N<=1000),代表参加游戏的人数。第2个数是一个浮点数p,代表掷一次骰子会出现该特定事件的机率(例如我们规定掷出3代表此特定事件,那p就是掷出3的机率,以一颗一般的骰子来说,p=1/6=0.166666)。第3个数为一个整数I(I<=N),代表要你求的是第I个人。

Output

对于每组测试资料,请输出第I个人赢得游戏的机率。请准确到小数点后4位。

Sample input

2
2 0.166666 1
2 0.166666 2

Sample Output

0.5455
0.4545

[F] Audiophobia

想想看你何其幸运,能够呼吸并且还能快乐的写程式。但是我们忧虑我们的子孙可能就没有这么幸运了。你知道的,地球正面临许多的污染,环境的或是社会的污染。我们的漠视也加重污染的扩展。

现在我们要谈的是「噪音」的污染。一般我们以「分贝」当作声音大小的单位。超过130分贝的噪音会让人很不舒服,谈话的声音大概是60到65分贝,繁忙吵杂的交通大概是70到80分贝。

以下的城市地图中边代表街道,点代表十字路口。在边上的整数代表这条街平均的噪音大小。

要从A到G,你可以走这样的路径:ACFG,而你必须忍受的最大噪音就是140分贝。如果你走的路径是ABEG,或ABDG,或ACFDG,那你必须忍受的最大噪音分别是90, 120和80分贝。当然还有其他路径,但是明显的ACFDG是最舒服的路径了,因为你面临的噪音最大不会超过80分贝。

在这个问题中,给你城市的递图,请你找出从某个点到某个点你所必须忍受的最小噪音。

Input

输入包含多组测试资料。每组测试资料的第一列含有3个整数C(<= 100)、S(<=1000)和Q(<= 10000)。C代表点的数目(点的号码从1到C),S则代表街道的数目,Q代表这组测试资料中有多少个小问题。

接下来的S列,每列有三个整数C 1 ,C 2和d。C 1 ,C 2代表点的号码且C 1不会等于C 2,d代表这街道平均的噪音。再接下来的Q列每列有2个整数C 1 ,C 2(C 1不会等于C 2),就是要请你算出从C 1到C 2代你必须忍受的最小噪音是多少。

若C=0,S=0,Q=0 代表输入结束。请参考Sample Input。

Output

对每组测试资料先输出这是第几组测试资料,然后对每个小问题输出从C 1到C 2代你必须忍受的最小噪音是多少(如果该路径不存在,请输出no path)。各组测试资料间请输出一空白列,输出格式请参考Sample Output。

Sample InputSample Output
7 9 3
1 2 50
1 3 60
2 4 120
2 5 90
3 6 50
4 6 80
4 7 70
5 7 40
6 7 140
1 7
2 6
6 2
7 6 3
1 2 50
1 3 60
2 4 120
3 6 50
4 6 80
5 7 40
7 5
1 7
2 4
0 0 0
Case #1
80
60
60
 
Case #2
40
no path
80

[G] Integer Inquiry

在Turbo C中的整数资料型态(int)最大的正整数(unsigned int)只能到65535,即使使用长整数(unsigned long)最大也只能到4294967295。但是有时候这样的整数仍然不够大,我们需要一种VeryLongInteger,他的长度为小于或等于100个数字。

这个问题是要请你写一个程式来作VeryLongInteger的加法。

Input

输入的每一行代表一个VeryLongInteger(所有VeryLongInteger均为正数)。
最后一行只包含一个0,代表输入结束。

Output

输出所有输入的VerylongInteger之和。

Sample input

123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0

Sample Output

370370367037037036703703703670

[H] Lining Up

「我要如何解决这个问题呢?」飞行员说。

这个飞行员正面临一项不容易的任务,他必须在一个危险区域中的某些定点投掷包裹。因为他只能穿越此区域一次,而且是飞直线,所以他必须尽可能的通过那些定点,以便投掷多一点包裹。所有的定点均以平面座标来表示。从这些定点的座标资料,飞行员想要知道最多有多少个点是在同一直线上的。请你写一个有效率的程式来帮助他。

Input

输入的第一列有一个正整数,代表以下有多少组测试资料。每组测试资料有N对整数(1 < N < 700),每对整数占一列,代表一个定点的X,Y座标。不会有2个点位于同一位置上。

输入的第一列与第一组测试资料之间,以及各组测试资料之间均有一空白列,请参考Sample Input。

Output

每组测试资料输出一列,最多有多少个点是在同一直线上。

测试资料间亦请空一列。

Sample Input

2

1 1
2 2
3 3
9 10
10 11

1 2
3 4

Sample Output

3

2



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值