Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Comparator;
- import java.util.LinkedList;
- import java.util.Random;
- import java.util.StringTokenizer;
- public class Main
- {
- public static void main(String[] args) throws IOException
- {
- Main main = new Main();
- main.read();
- }
- private BufferedReader in;
- private StringBuilder ans;
- private ArrayList<Img> originalImages;
- private Img min;
- private void read() throws IOException
- {
- // streams
- boolean file = false;
- if (file)
- in = new BufferedReader(new FileReader("input.txt"));
- else
- in = new BufferedReader(new InputStreamReader(System.in));
- ans = new StringBuilder();
- StringTokenizer tok;
- // read cases
- int nCases = Integer.parseInt(in.readLine());
- for (int cas = 1; cas <= nCases; cas++)
- {
- // read original images
- originalImages = new ArrayList<Img>();
- int nOriginalImages = Integer.parseInt(in.readLine());
- for (int i = 0; i < nOriginalImages; i++)
- {
- tok = new StringTokenizer(in.readLine());
- int w = Integer.parseInt(tok.nextToken());
- int h = Integer.parseInt(tok.nextToken());
- addImage(w, h);
- }
- // output
- ans.append("Case " + cas + ":\n");
- int requiredImages = Integer.parseInt(in.readLine());
- for (int i = 0; i < requiredImages; i++)
- {
- tok = new StringTokenizer(in.readLine());
- int w = Integer.parseInt(tok.nextToken());
- int h = Integer.parseInt(tok.nextToken());
- ans.append(solve(w, h) + "\n");
- }
- }
- // output
- System.out.print(ans.toString());
- }
- private String solve(int w, int h)
- {
- // check all given images and all possible rotations
- min = new Img(20000, 20000, 3);
- for (Img img : originalImages)
- {
- // same
- if (img.w == w && img.h == h)
- minimize(img.w, img.h, 0);
- // rotated
- if (img.w == h && img.h == w)
- minimize(img.w, img.h, 1);
- // cropped
- if (img.w >= w && img.h >= h)
- minimize(img.w, img.h, 1);
- // cropped and rotated
- if (img.h >= w && img.w >= h)
- minimize(img.w, img.h, 2);
- }
- return min.w + " " + min.h + " " + min.k;
- }
- private void minimize(int w, int h, int k)
- {
- if (w*h != min.w * min.h)
- {
- if (w * h <= min.w * min.h)
- min = new Img(w, h, k);
- }
- else if (w != min.w)
- {
- if (w <= min.w )
- min = new Img(w, h, k);
- }
- else if (k !=min.k)
- {
- if (k <= min.k)
- min = new Img(w, h, k);
- }
- }
- private void addImage(int w, int h)
- {
- // add all scaled image
- int newW = w;
- int newH = h;
- while (true)
- {
- originalImages.add(new Img(newW, newH, 0));
- if (Math.min(newW, newH) > 100)
- break;
- newW += w;
- newH += h;
- }
- }
- }
- class Img
- {
- int w;
- int h;
- int k;
- public Img(int w, int h, int k)
- {
- this.w = w;
- this.h = h;
- this.k = k;
- }
- public String toString()
- {
- return w + ":" + h;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement