POJ 刷题系列:1083. Moving Tables

来源:互联网 发布:qq飞车神影官方数据 编辑:程序博客网 时间:2024/05/16 06:32

POJ 刷题系列:1083. Moving Tables

传送门:POJ 1083. Moving Tables

题意:

一条走廊,两栏房间。搬运工每次从房价i移动到房间j需要10分钟,给定一系列的移动路线 i -> j,问最少需要多少时间。
alt text

思路:
实际上是求解多个区间中重叠区间的最大个数。采用imos累积,很好的一个思路。先对每个区间的起点和终点求偏导,然后再累积,累积数组中的最大值即为答案。详见:IMOS 累积法

需要注意的是:如果起点是偶数则让起点-1;如果终点是奇数,则让终点+1。因为从图中可以看出房间[1, 2],[3, 4]属于公用的,一旦一个被使用,另一个也将占用。

代码如下:

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.util.Arrays;import java.util.InputMismatchException;public class Main{    InputStream is;    PrintWriter out;    String INPUT = "./data/judge/201708/P1083.txt";    void solve() {        int t = ni();        while (t --> 0){            int n = ni();            int[] ccu = new int[400 + 16];            for (int i = 0; i < n; ++i){                int s = ni();                int e = ni();                int sum = s + e;                s = Math.min(s, e);                e = sum - s;                if ((s & 1) == 0) s--;                if ((e & 1) != 0) e++;                ccu[s] ++;                ccu[e] --;            }            int max = 0;            for (int i = 1; i < ccu.length; ++i){                ccu[i] += ccu[i - 1];                max = Math.max(max, ccu[i]);            }            out.println(max * 10);        }    }    void run() throws Exception {        is = oj ? System.in : new FileInputStream(new File(INPUT));        out = new PrintWriter(System.out);        long s = System.currentTimeMillis();        solve();        out.flush();        tr(System.currentTimeMillis() - s + "ms");    }    public static void main(String[] args) throws Exception {        new Main().run();    }    private byte[] inbuf = new byte[1024];    public int lenbuf = 0, ptrbuf = 0;    private int readByte() {        if (lenbuf == -1)            throw new InputMismatchException();        if (ptrbuf >= lenbuf) {            ptrbuf = 0;            try {                lenbuf = is.read(inbuf);            } catch (IOException e) {                throw new InputMismatchException();            }            if (lenbuf <= 0)                return -1;        }        return inbuf[ptrbuf++];    }    private boolean isSpaceChar(int c) {        return !(c >= 33 && c <= 126);    }    private int skip() {        int b;        while ((b = readByte()) != -1 && isSpaceChar(b))            ;        return b;    }    private double nd() {        return Double.parseDouble(ns());    }    private char nc() {        return (char) skip();    }    private String ns() {        int b = skip();        StringBuilder sb = new StringBuilder();        while (!(isSpaceChar(b))) { // when nextLine, (isSpaceChar(b) && b != '                                    // ')            sb.appendCodePoint(b);            b = readByte();        }        return sb.toString();    }    private char[] ns(int n) {        char[] buf = new char[n];        int b = skip(), p = 0;        while (p < n && !(isSpaceChar(b))) {            buf[p++] = (char) b;            b = readByte();        }        return n == p ? buf : Arrays.copyOf(buf, p);    }    private char[][] nm(int n, int m) {        char[][] map = new char[n][];        for (int i = 0; i < n; i++)            map[i] = ns(m);        return map;    }    private int[] na(int n) {        int[] a = new int[n];        for (int i = 0; i < n; i++)            a[i] = ni();        return a;    }    private int ni() {        int num = 0, b;        boolean minus = false;        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'))            ;        if (b == '-') {            minus = true;            b = readByte();        }        while (true) {            if (b >= '0' && b <= '9') {                num = num * 10 + (b - '0');            } else {                return minus ? -num : num;            }            b = readByte();        }    }    private long nl() {        long num = 0;        int b;        boolean minus = false;        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'))            ;        if (b == '-') {            minus = true;            b = readByte();        }        while (true) {            if (b >= '0' && b <= '9') {                num = num * 10 + (b - '0');            } else {                return minus ? -num : num;            }            b = readByte();        }    }    private boolean oj = System.getProperty("ONLINE_JUDGE") != null;    private void tr(Object... o) {        if (!oj)            System.out.println(Arrays.deepToString(o));    }}

这里写图片描述

原创粉丝点击