原題傳送門:威威貓系列故事——喫雞腿
威威貓的身體由n個器官構成,由於他的身體很特殊所以他的增長也很特殊(不要問爲什麼,喜歡喫雞腿的貓已經夠奇怪了)。他的增長有個k1和k2係數,而且每天的增長量和前一天有關,我們假設這n個器官在第i天的數值分別是a(i,1), a(i,2), a(i,3) …… a(i,n),那麼,第i+1天他每個器官的數值就會變成:
a(i+1,1) = k1 * a(i,1) + k2 * a(i,2)
a(i+1,2) = k1 * a(i,2) + k2 * a(i,3)
......
a(i+1,n) = k1 * a(i,n) + k2 * a(i,1)
威威貓的體重等於他的所有器官的數值之和,並且他還擁有一個特殊的機能,就是會自動檢測自己的體重,如果他的體重比K大,那麼就會自動停止生長(爲了每天都能喫到雞腿),由於威威貓的特殊身體構造他的體重是可能會變成負數的。
現在我給你n個器官的初始數值和他的增長係數k1,k2,請問他幾天之後會停止生長(如果初始體重已經比K大,則是0天后停止生長),如果他永遠無法停止生長那麼就輸出"inf"。(引號不用輸出)
每組數據的第一行包含4個數字n,k1,k2,k,代表威威貓有n個器官,他的生長係數是k1、k2(可能是小數),當體重超過k的時候他就停止生長。
接下來的一行是n個數ai,代表威威貓每個器官第一天的數值是多少。
[Technical Specification]
T <= 100
1 <= n <= 10000
-100 <= k1, k2 <= 100
1 <= k <= 10 ^ 18
1 <= ai <= 1000(1 <= i <= n)
具體可參見sample output。
1 package org.contests; 2 3 import java.util.Scanner; 4 5 public class ChickenLegs { 6 public static void main(String[] args) { 7 Scanner scan = new Scanner(System.in); 8 int totalGroupNum = scan.nextInt(); 9 for(int ti = 0; ti < totalGroupNum; ti++){ 10 int rowNum = scan.nextInt(); 11 double k1 = scan.nextDouble(); 12 double k2 = scan.nextDouble(); 13 long k = scan.nextLong(); 14 int dayNum = 1; 15 boolean isInf = false; 16 17 double totalWeight = 0; 18 19 for(int ri = 0; ri < rowNum; ri++){ 20 totalWeight += scan.nextInt(); 21 } 22 23 while(totalWeight <= k){ 24 25 if(Math.abs(k1 + k2) <= 1){// | k1 + k2 | <= 1 26 isInf = true; 27 break; 28 } 29 30 totalWeight = (k1 + k2) * totalWeight; 31 dayNum++; 32 } 33 34 if(isInf){ 35 System.out.println("Case #"+(ti+1)+": inf"); 36 }else{ 37 System.out.println("Case #"+(ti+1)+": "+(dayNum-1)); 38 } 39 } 40 } 41 }
在HDU提交時,java代碼不需要package語句,需要把public類的類名改爲Main,下列代碼是在HDU提交AC了的代碼:
1 import java.util.Scanner; 2 3 public class Main{ 4 public static void main(String[] args) { 5 Scanner scan = new Scanner(System.in); 6 int totalGroupNum = scan.nextInt(); 7 for(int ti = 0; ti < totalGroupNum; ti++){ 8 int rowNum = scan.nextInt(); 9 double k1 = scan.nextDouble(); 10 double k2 = scan.nextDouble(); 11 long k = scan.nextLong(); 12 int dayNum = 1; 13 boolean isInf = false; 14 15 double totalWeight = 0; 16 17 for(int ri = 0; ri < rowNum; ri++){ 18 totalWeight += scan.nextInt(); 19 } 20 21 while(totalWeight <= k){ 22 23 if(Math.abs(k1 + k2) <= 1){// | k1 + k2 | <= 1 24 isInf = true; 25 break; 26 } 27 28 totalWeight = (k1 + k2) * totalWeight; 29 dayNum++; 30 } 31 32 if(isInf){ 33 System.out.println("Case #"+(ti+1)+": inf"); 34 }else{ 35 System.out.println("Case #"+(ti+1)+": "+(dayNum-1)); 36 } 37 } 38 } 39 }
吐槽:
由於學藝不精加之題目有些陷阱,此題在規定時間內我麼有完成,還差得很遠額~~