【騰訊第二屆校園編程馬拉松】HDU-4525,威威貓系列故事——喫雞腿

原題傳送門:威威貓系列故事——喫雞腿

題目如下(添加了部分陷阱提示,以加粗加下劃線顯示)
Problem Description
  威威貓不是一隻普通的貓,普通的貓喜歡喫魚,但威威貓最喜歡喫雞腿。他每天都在不停的喫啊喫,吃了一隻又一隻雞腿。現在他遇到了一個難題,如果他的體重太胖那麼他的主人就不給他喫雞腿了,所以他需要你的幫助。
  威威貓的身體由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"。(引號不用輸出)
 
 
Input
輸入數據第一行是一個正整數T,表示有T組測試數據;
每組數據的第一行包含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) 
 

 

Output
對於每組測試數據,請首先輸出"Case #X: ",X代表測試用例的編號,然後輸出一個數ans,代表ans天之後他會停止生長,如果不會停止就輸出inf
具體可參見sample output。
 

 

Sample Input
2
5 1 1 10
1 1 1 1 1
5 1 1 500
1 1 1 1 1
 

 

Sample Output
Case #1: 2
Case #2: 7
 
題目分析:
將題目給出的所有遞推公式相加(左端相加,右端相加),整理後得到一個體重增長的遞推公式:Wi+1 = (k1 + k2)Wi,由此可見如果初始體重不大於k的話,那麼(k1+k2)就是導致體重增大或縮小的因素。當|k1+k2| <= 1時,體重將永遠不會超過給定的k值。因此代碼如下:
複製代碼
 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 }
複製代碼

吐槽:

由於學藝不精加之題目有些陷阱,此題在規定時間內我麼有完成,還差得很遠額~~

PS: 我存在過,我遇見過,我失敗過。 有些路,明明有坑卻從沒人放警示牌。有些事,明明是錯的卻沒人去管。有些話,明明應該告訴後來人卻沒人去說。 既然沒人做,那就我來吧。希望我曾經歷過的挫折不再重現於後來人。希望傳承能夠不是隻掛在嘴邊。希望人模人樣的“人”能夠真正做人。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章