Milking+Cows

USACO 1.2 - Milking Cows
Three farmers rise at 5 am each morning and head for the barn to milk three cows. The first farmer begins milking his cow at time 300 (measured in seconds after 5 am) and ends at time 1000. The second farmer begins at time 700 and ends at time 1200. The third farmer begins at time 1500 and ends at time 2100. The longest continuous time during which at least one farmer was milking a cow was 900 seconds (from 300 to 1200). The longest time no milking was done, between the beginning and the ending of all milking, was 300 seconds (1500 minus 1200).

Your job is to write a program that will examine a list of beginning and ending times for N (1 <= N <= 5000) farmers milking N cows and compute (in seconds):


 * The longest time interval at least one cow was milked.
 * The longest time interval (after milking starts) during which no cows were being milked.

PROGRAM NAME: milk2 INPUT FORMAT Line 1: The single integer Lines 2..N+1: Two non-negative integers less than 1000000, the starting and ending time in seconds after 0500 SAMPLE INPUT (file milk2.in)

3 300 1000 700 1200 1500 2100

OUTPUT FORMAT A single line with two integers that represent the longest continuous time of milking and the longest idle time. SAMPLE OUTPUT (file milk2.out)

900 300

Source Code code format="java"

/*    ID: wjh3331 LANG: JAVA TASK: milk2 */   import java.io.*; import java.util.StringTokenizer;

public class milk2 { public static final int MAX = 1000000; // 시각 입력의 최대값

public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new FileReader("milk2.in")); PrintWriter out = new PrintWriter(new FileWriter("milk2.out"));

int n = Integer.parseInt(in.readLine); // 농부의 수

boolean[] times = new boolean[MAX]; // 작업 유무 초단위로 체크

int startMin = MAX; // 일을 가장 먼저 시작한 시각 int endMax = 0; // 모든 일을 마친 시각

for(int i = 0; i < n; i++) { StringTokenizer st = new StringTokenizer(in.readLine); int start = Integer.parseInt(st.nextToken); // 시작 시각 int end = Integer.parseInt(st.nextToken); // 종료 시각

// 가장 먼저 일을 한 시각을 업데이트 if(start < startMin) { startMin = start; }         // 가장 늦게 일을 마무리한 시각을 업데이트 if(end > endMax) { endMax = end; }

// 일을 한 기록을 초단위로 체크 for(int j = start; j < end; j++) { times[j] = true; }       }

int workCount = 0; // 일한 시간 카운트 int idleCount = 0; // 쉰 시간 카운트 int workMax = 0; // 최대로 일한 시간 int idleMax = 0; // 최대로 쉰 시간

int i = startMin; while(true) { if(i >= endMax) { break; }

// 일한 시간 카운트 while(times[i]) { workCount++; i++; }         // 최대 일한 시간 업데이트 if(workCount > workMax) { workMax = workCount; }         workCount = 0;

if(i >= endMax) { break; }

// 쉰 시간 카운트 while(!times[i]) { idleCount++; i++; }         // 최대 쉰 시간 업데이트 if(idleCount > idleMax) { idleMax = idleCount; }         idleCount = 0; }

// 최대 일한 시간과 최대 쉰 시간 출력 out.println(workMax + " " + idleMax);

// 종료 out.close; System.exit(0); }   }

code

Comment 문제를 보니 정렬문제 같은 느낌이 들었지만 제 성격이 삐뚤어서... 정렬을 안하고 해볼려고 좀 무식한 방법을 사용해 보았습니다. 입력의 최대값이 int 범위 안이라는 것을 보고 배열을 만들어서 거기다가 그냥 체크하기로 했습니다. 그리고 마지막엔 배열을 따라가며 카운트 했습니다. 케이스의 숫자가 엄청 늘어나고 일한 시간 간격들이 엄청 줄어들면 그마나 좀 나을라나. ㄷㄷ