`
翼若云
  • 浏览: 5979 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

POJ1006 Biorhythms

    博客分类:
  • poj
阅读更多

我使用的算法比较简单,就是循环,当出现(day-p) % 23 == 0 && (day-e) % 28 == 0 && (day-i) % 33 ==0表示当天是三个周期的高峰。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int idx = 0;
        while(true){
            int p = cin.nextInt();
            int e = cin.nextInt();
            int i = cin.nextInt();
            int d = cin.nextInt();


            if(p == -1 && e == -1 && i==-1 && d==-1){
                break;
            }
            idx++;
            System.out.println("Case "+idx+": the next triple peak occurs in "+ getNextPeakDay(p, e, i, d)+" days.");
        }
    }
   
    private static int getNextPeakDay(int p, int e, int i, int d){
        int day = d;
        while(true){
            day++;
            if((day-p) % 23 == 0 && (day-e) % 28 == 0 && (day-i) % 33 ==0){
                break;
            }
        }
        return day-d;
    }
}

 

 

网上有另外一种解法,效率比较高,暂时没想出是怎么推导出的。

import java.util.Scanner;   
  
public class Main {   
  
    public static void main(String[] args) {   
        Scanner scan = new Scanner(System.in);   
        int k = 0;   
        while (scan.hasNext()) {   
            int p = scan.nextInt();   
            int e = scan.nextInt();   
            int i = scan.nextInt();   
            int d = scan.nextInt();   
            if (p == -1 && e == -1 && i == -1 && d == -1) {   
                break;   
            }   
            k++;   
            int days = (5544 * p + 14421 * e + 1288 * i - d) % (21252);   
            if (days <= 0) {   
                days = 23 * 28 * 33 + days;   
            }   
            System.out.println("Case " + k   
                    + ": the next triple peak occurs in " + days   
                    + " days.");   
        }   
  
  
    }   
}  
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics