■1149 Cut the Cakes
やればできる.
import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;
public class Main{
Scanner sc=new Scanner(System.in);
int INF=1<<28;
double EPS=1e-9;
int n, w, h;
int[] ps, ss;
void run(){
for(;;){
n=sc.nextInt();
w=sc.nextInt();
h=sc.nextInt();
if((n|w|h)==0){
break;
}
ps=new int[n];
ss=new int[n];
for(int i=0; i<n; i++){
ps[i]=sc.nextInt()-1;
ss[i]=sc.nextInt();
}
solve();
}
}
void solve(){
LinkedList<R> list=new LinkedList<R>();
list.add(new R(0, 0, w, h));
for(int i=0; i<n; i++){
R r=list.remove(ps[i]);
debug(i, r.x, r.y, r.w, r.h);
int x=r.x, y=r.y;
for(int k=0; k<ss[i]; k++){
if(y==r.y&&x<r.x+r.w){
x++;
}else if(x==r.x+r.w&&y<r.y+r.h){
y++;
}else if(y==r.y+r.h&&x>r.x){
x--;
}else if(x==r.x&&y>r.y){
y--;
}else{
debug("Error!");
}
// debug(x,y);
}
debug(x, y);
R r1=null, r2=null;
if(x==r.x||x==r.x+r.w){
r1=new R(r.x, r.y, r.w, y-r.y);
r2=new R(r.x, r.y+r1.h, r.w, r.h-r1.h);
}else{
r1=new R(r.x, r.y, x-r.x, r.h);
r2=new R(r.x+r1.w, r.y, r.w-r1.w, r.h);
}
debug("r1", r1.x, r1.y, r1.w, r1.h);
debug("r2", r2.x, r2.y, r2.w, r2.h);
if(r1.w*r1.h<r2.w*r2.h){
list.add(r1);
list.add(r2);
}else{
list.add(r2);
list.add(r1);
}
}
R[] rs=list.toArray(new R[0]);
sort(rs);
String ans="";
for(R r : rs){
ans+=(r.w*r.h)+" ";
debug(r.x, r.y, r.w, r.h, r.w*r.h);
}
println(ans.substring(0, ans.length()-1));
}
class R implements Comparable<R>{
int x, y, w, h;
R(int x, int y, int w, int h){
this.x=x;
this.y=y;
this.w=w;
this.h=h;
}
@Override
public int compareTo(R r){
return w*h-r.w*r.h;
}
}
void debug(Object... os){
// System.err.println(Arrays.deepToString(os));
}
void print(String s){
System.out.print(s);
}
void println(String s){
System.out.println(s);
}
public static void main(String[] args){
// System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
new Main().run();
}
}
0 件のコメント:
コメントを投稿