空间回廊
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
有一款叫做空间回廊的游戏,游戏中有着n个房间依次相连,如图,1号房间可以走到2号房间,以此类推,n号房间可以走到1号房间。
这个游戏的最终目的是为了在这些房间中留下尽可能多的烙印,在每个房间里留下烙印所花费的法力值是不相同的,已知他共有m点法力值,这些法力是不可恢复的。
小明刚接触这款游戏,所以只会耿直的玩,所以他的每一个行动都是可以预料的:
一开始小明位于1号房间。
如果他剩余的法力能在当前的房间中留下一个烙印,那么他就会毫不犹豫的花费法力值。
无论是否留下了烙印,下一个时刻他都会进入下一个房间,如果当前位于i房间,则会进入i+1房间,如果在n号房间则会进入1号房间。
当重复经过某一个房间时,可以再次留下烙印。
很显然,这个游戏是会终止的,即剩余的法力值不能在任何房间留下烙印的时候,游戏终止。请问他共能留下多少个烙印。
输入
输入第一行有两个正整数n和m,分别代表房间数量和小明拥有的法力值。(1<=n<=100000,1<=m<=10^18)
输入第二行有n个正整数,分别代表1~n号房间留下烙印的法力值花费。(1<=a_i<=10^9)
输出
输出仅包含一个整数,即最多能留下的烙印。
样例输入
4 21
2 1 4 3
样例输出
9
提示
样例解释:
显然是所有房间都留下两个烙印,然后剩下1点法力值,仅能在2号房间再留下一个烙印.
做题时思路
由题意可想到循环链表,建立Room类,属性mp,最后一个Room指向头结点。每经过一个房间,判断当前mp与房间mp之间的关系,决定是否执行count++,当所剩mp<房间最小mp时退出循环,最后输出count
代码实现(AC)
import java.util.Scanner;
class Room{
public int mp;
public Room next;
public Room(int value){
this.mp = value;
}
}
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int totalMP = in.nextInt();
int[] s = new int[n];
int minMp = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
s[i] = in.nextInt();
if (minMp>s[i]){
minMp = s[i];
}
}
int firstId = s[0];
Room firstRoom = new Room(firstId);
Room room = firstRoom;
Room lastRoom = firstRoom;
for (int i = 1; i < n; i++) {
Room newroom = new Room(s[i]);
room.next = newroom;
room = room.next;
lastRoom = newroom;
}
lastRoom.next = firstRoom;
tanxian(firstRoom, totalMP,minMp);
}
private static void tanxian(Room firstRoom, int totalMP, int minMp) {
int count = 0;
while (totalMP>=minMp){
if (totalMP>=firstRoom.mp){
totalMP-=firstRoom.mp;
count++;
}
firstRoom = firstRoom.next;
}
System.out.print(count);
}
}