??空間回廊
??題目描述:
有一款叫做空間回廊的游戲闹啦,游戲中有著n個(gè)房間依次相連一铅,如圖躏救,1號(hào)房間可以走到2號(hào)房間偶妖,以此類推,n號(hào)房間可以走到1號(hào)房間纯陨。
這個(gè)游戲的最終目的是為了在這些房間中留下盡可能多的烙印坛芽,在每個(gè)房間里留下烙印所花費(fèi)的法力值是不相同的,已知他共有m點(diǎn)法力值翼抠,這些法力是不可恢復(fù)的咙轩。
小明剛接觸這款游戲,所以只會(huì)耿直的玩阴颖,所以他的每一個(gè)行動(dòng)都是可以預(yù)料的:
1.一開(kāi)始小明位于1號(hào)房間活喊。
2.如果他剩余的法力能在當(dāng)前的房間中留下一個(gè)烙印,那么他就會(huì)毫不猶豫的花費(fèi)法力值量愧。
3.無(wú)論是否留下了烙印钾菊,下一個(gè)時(shí)刻他都會(huì)進(jìn)入下一個(gè)房間,如果當(dāng)前位于i房間侠畔,則會(huì)進(jìn)入i+1房間结缚,如果在n號(hào)房間則會(huì)進(jìn)入1號(hào)房間损晤。
4.當(dāng)重復(fù)經(jīng)過(guò)某一個(gè)房間時(shí)软棺,可以再次留下烙印。
很顯然尤勋,這個(gè)游戲是會(huì)終止的喘落,即剩余的法力值不能在任何房間留下烙印的時(shí)候茵宪,游戲終止。請(qǐng)問(wèn)他共能留下多少個(gè)烙印瘦棋。
輸入
輸入第一行有兩個(gè)正整數(shù)n和m稀火,分別代表房間數(shù)量和小明擁有的法力值。(1<=n<=100000,1<=m<=10^18)
輸入第二行有n個(gè)正整數(shù)赌朋,分別代表1~n號(hào)房間留下烙印的法力值花費(fèi)凰狞。(1<=a_i<=10^9)
輸出
輸出僅包含一個(gè)整數(shù),即最多能留下的烙印沛慢。
樣例輸入
4 21
2 1 4 3
樣例輸出
9
提示
樣例解釋:
顯然是所有房間都留下兩個(gè)烙印赡若,然后剩下1點(diǎn)法力值,僅能在2號(hào)房間再留下一個(gè)烙印.
?代碼實(shí)現(xiàn)
#include<iostream>
using namespace std;
int main(){
//輸入房間數(shù)量m团甲,小明擁有的法力值n
int n, m;
cin >> n >> m;
//輸入每個(gè)房間消耗的法力值
int arr[n];
for(int i = 0; i < n; i++){
cin >> arr[i];
}
//定義兩個(gè)變量逾冬,cnt用來(lái)計(jì)數(shù),記錄留下的烙印數(shù)
//sign,為設(shè)立的標(biāo)志躺苦,當(dāng)小明在一圈中消耗過(guò)法力值身腻,標(biāo)志位置為1,
//如果一圈下來(lái)sign=0匹厘,那么代表這一圈小明沒(méi)有消耗法力值嘀趟,那么就可以結(jié)束循環(huán)了。
int cnt = 0;
int sign = 0;
//循環(huán)開(kāi)始愈诚,因?yàn)椴恢酪h(huán)多少遍去件,所以中間參數(shù)為空
for(int i = 0; ; i++ ){
//如果法力值大于當(dāng)前格子的法力值
if( m >= arr[i]){
m = m - arr[i]; //法力值減去當(dāng)前格子的法力值
cnt++; //烙印數(shù)+1
sign = 1; //本圈消耗了法力值,sign=1
}
//當(dāng)i = n - 1扰路,說(shuō)明一次循環(huán)結(jié)束尤溜,如果sign=1,則需要進(jìn)行下一輪循環(huán)
//那么就把sign歸0汗唱,有因?yàn)榻Y(jié)束時(shí)會(huì)有i++宫莱,所以i=0-1,那么就開(kāi)啟新一輪循環(huán)
if((i == n - 1) && (sign == 1)){
sign = 0;
i = 0-1;
}
//當(dāng)i = n - 1哩罪,循環(huán)結(jié)束授霸,sign=0,則不需要繼續(xù)循環(huán)际插,直接跳出死循環(huán)碘耳。
else if((i == n - 1) && (sign == 0)){
break;
}
}
cout << cnt << endl;
return 0;
}
遇到此類問(wèn)題,但看了文章還是未解決框弛,
評(píng)論或加 QQ:781378815