【腾讯第二届校园编程马拉松】HDU-4525,威威猫系列故事——吃鸡腿
生活随笔
收集整理的這篇文章主要介紹了
【腾讯第二届校园编程马拉松】HDU-4525,威威猫系列故事——吃鸡腿
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原題傳送門:威威貓系列故事——吃雞腿
題目如下(添加了部分陷阱提示,以加粗加下劃線顯示) Problem Description 威威貓不是一只普通的貓,普通的貓喜歡吃魚,但威威貓最喜歡吃雞腿。他每天都在不停的吃啊吃,吃了一只又一只雞腿?,F在他遇到了一個難題,如果他的體重太胖那么他的主人就不給他吃雞腿了,所以他需要你的幫助。威威貓的身體由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 }吐槽:
由于學藝不精加之題目有些陷阱,此題在規定時間內我么有完成,還差得很遠額~~
轉載于:https://www.cnblogs.com/FlameRen/archive/2013/03/26/2981996.html
總結
以上是生活随笔為你收集整理的【腾讯第二届校园编程马拉松】HDU-4525,威威猫系列故事——吃鸡腿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础02 方法与数据成员
- 下一篇: NIOS II 创建示例设计_Quart