天天看点

《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.4 相关题库

【2.4.1 mileage bank】

【问题描述】

acm(airline of charming merlion,迷人的鱼尾狮航空公司)的飞行里程计划对于经常要乘坐飞机的旅客非常不错。一旦乘坐了一次acm航班,你就可以在acm里程银行中根据实际飞行里程赚取acm奖励里程。而且,你可以使用acm里程银行中的acm奖励里程来兑换将来的acm免费机票。

下表帮助你计算当你要乘坐acm航班的时候,可以赚取多少acm奖励里程。

《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.4 相关题库

上表表明,你的acm奖励里程由两部分组成。一部分是你的实际飞行里程(一个航班的经济舱的最低acm奖励里程为500英里),另一部分是当你乘坐商务舱和头等舱时的飞行里程奖励(其精度可达1英里)。例如,你乘坐acm航班从北京飞到东京(北京和东京之间的实际里程是1329英里),根据你乘坐的舱类y、b或f分别可以奖励1329 英里、1994英里或2658英里。你乘坐acm航班从上海飞往武汉(上海和武汉之间的实际里程为433英里),你乘坐经济舱可以奖励500英里,乘坐商务舱可以奖励650英里。

请帮助acm编写一个程序,来自动计算acm的奖励里程。

输入:

输入包含若干测试用例,每个测试用例含多条航班记录,每条航班记录占一行,格式如下:

出发城市   目的地城市   实际里程   舱类代码

每个测试用例以包含一个0的一行结束。

以包含一个#的一行表示输入结束。

输出:

对每个测试用例,输出一行,给出acm奖励里程的总和。

《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.4 相关题库

试题来源:acm beijing 2002

在线测试地址:poj 1326,zoj 1365,uva 2524

提示

本题是一道简单的直叙式模拟题:依次输入航班信息,根据每次航班的实际里程和舱类代码累计奖励里程的总和。

【2.4.2 cola】

便利店给出以下的优惠:

“每3个空瓶可以换1瓶可口可乐。”

现在,你准备从便利店买一些可口可乐(n瓶),你想知道你最多可以从便利店拿到多少瓶可口可乐。

图2.4-1给出了n=8的情况。方法1是标准的方法:喝完8瓶可口可乐之后,你有8个空瓶;你用6只空瓶去换,得到了2瓶新的可口可乐;喝完后你有4个空瓶,因此用3个空瓶又换了一瓶新的可口可乐。最后,你手上有2只空瓶,不能再去换到新的可乐了。因此,你一共获得8+2+1=11瓶可乐。

《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.4 相关题库

但实际上有更好的方法。在方法2中,先从你的朋友(或者店主)那里借一个空瓶,这样就可以获得8+3+1=12瓶可乐。当然,你要还给你的朋友你剩下的空瓶。

输入若干行,每行给出一个整数n (1 ≤ n ≤ 200)。

对于每个测试用例,程序要输出你最多可以喝到多少瓶可口可乐。你可以向别人借空瓶,但如果这样做,要确保你有足够的瓶子还给他们。

《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.4 相关题库

试题来源:contest of newbies 2006

在线测试地址:uva 11150

设想买的可口可乐的瓶数为n;借的空瓶数为i;总瓶数为cnt,兑换前cnt=n+i;实际喝到的可口可乐瓶数为tot ,兑换前tot=n;ans为最多可喝到的可口可乐瓶数,初始时为0。

反复模拟如下兑换过程,直至cnt≤3为止:

step 2: 如果a = 1,则算法终止;

step 3: 如果a是偶数,则用a / 2代替a,转向step 2;

step 4: 如果a是奇数,则用3 *a + 1代替a,转向step 2。

ans初始化为0;

 while(a<=l&&a!=1){ // 若当前项值不超过上限且非1,则项数+1

  ans++;

  根据a的奇偶性计算下一项,即a=a&1?3*a+1:a/2;

  }

 if(a==1)ans++;// 若最后一项为1,则增加1项

继续阅读