usaco 4.2.3 Job Processing

来源:互联网 发布:js new date 前一天 编辑:程序博客网 时间:2024/05/16 13:43
/*ID: daniel.20LANG: JAVATASK: job*/import java.util.*;import java.io.*;class problem2{    StringBuilder sb = new StringBuilder();    int m,m1,m2;    int costA[] = new int[50];    int costB[] = new int[50];    void solver() throws IOException{        long start = System.currentTimeMillis();        BufferedReader reader = new BufferedReader(new FileReader("job.in"));        StringTokenizer st = new StringTokenizer(reader.readLine());        m=Integer.valueOf(st.nextToken());        int timer[] = new int[m+1];        int timerB[] = new int[m+1];        m1=Integer.valueOf(st.nextToken());        m2=Integer.valueOf(st.nextToken());        st = new StringTokenizer(reader.readLine());        for(int i=0;i<m1;i++){            costA[i] = Integer.valueOf(st.nextToken());        }        st = new StringTokenizer(reader.readLine());        for(int i=0;i<m2;i++){            costB[i] = Integer.valueOf(st.nextToken());        }                int tmp[] = Arrays.copyOf(costA, m1);        int counter=0;        int sum=0;        while(true){            counter++;            for(int i=0;i<tmp.length;i++){                tmp[i]--;                if(tmp[i]==0){                    sum++;                    timer[sum]=counter;                    tmp[i]=costA[i];                    if(sum==m) break;                }            }            if(sum==m) break;        }        System.out.println(counter);        sb.append(counter).append(" ");                        int delay[] = new int[m2+1];        sum=m;        counter=0;        while(sum>0){            int kk=999999999,pos=-1;            for(int i=1;i<=m2;i++){                if(delay[i]+costB[i-1]<kk){                    kk=delay[i]+costB[i-1];                    pos=i;                }            }            delay[pos]+=costB[pos-1];            timerB[sum--]=kk;        }        int max = -1;        for(int i=1;i<=m;i++){            if(timer[i]+timerB[i]>max){                max = timer[i]+timerB[i];            }        }        System.out.println(max);        sb.append(max);                PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("job.out")));        pw.println(sb.toString());          pw.close();          System.out.println("$:"+(System.currentTimeMillis()-start));        System.exit(0);              }}public class job {    public static void main(String[] args) throws Exception {        problem2 p = new problem2();        p.solver();    }}

哎,智商被碾压,做完以后感觉智商归零

换一个角度想问题就好解决了。

做第一问的时候,贪心的方法是N个机器同时开始工作,时间轴走动,当最先做完m个货物的时候,这个时间就是所需要的最大时间

做第二问的时候,先假设B也是同时开始处理所有货物,然后要求得每个货物是在第几秒完成的

要得到最终结果就是要加上A机器的延时,无疑是倒过来加的,因为总共M个货物,无论如何必须做完

就这个小转化使得思维很明朗,我想了半天第二问都不会转化。悲剧啊

0 0
原创粉丝点击