■B. Revenge of the Hot Dogs
ご想像のとおり二分探索.時間tに対して,各ホットドッグ屋がD離れることが出来るかを判定する必要がある.
これは,ホットドッグ屋を左から見ていき,可能な限り左に寄せていくことで判定できる.
二分探索の上限の見積もりが甘くLargeでWAってしまった….
- import java.util.*;
- import java.util.Map.Entry;
- import java.lang.*;
- import java.math.*;
- import java.io.*;
- import static java.lang.Math.*;
- import static java.util.Arrays.*;
- public class B{
- Scanner sc=new Scanner(System.in);
- long INF=1L<<40;
- double EPS=1e-9;
- int caze;
- int n, d;
- R[] rs;
- void run(){
- int tt=sc.nextInt();
- for(caze=1; caze<=tt; caze++){
- n=sc.nextInt();
- d=sc.nextInt();
- rs=new R[n];
- for(int i=0; i<n; i++){
- int p=sc.nextInt();
- int m=sc.nextInt();
- rs[i]=new R(p, m);
- }
- solve();
- }
- }
- void solve(){
- long left=0, right=INF;
- for(int i=0; i<n; i++){
- rs[i].p*=2;
- }
- d*=2;
- sort(rs, new Comparator<R>(){
- @Override
- public int compare(R r1, R r2){
- return r1.p-r2.p;
- }
- });
- for(int i=0; i<1000; i++){
- long mid=(left+right)/2;
- if(check(mid)){
- right=mid;
- }else{
- left=mid;
- }
- }
- debug(right, right/2.0);
- answer(String.format("%.1f", right/2.0));
- }
- boolean check(long t){
- long left=-INF;
- for(int j=0; j<n; j++){
- for(int i=0; i<rs[j].m; i++){
- if(rs[j].p+t<left+d){
- return false;
- }
- left=max(left+d, rs[j].p-t);
- // [left+d, INF) and [p-t , p+t]
- }
- }
- return true;
- }
- class R{
- int p, m;
- R(int p, int m){
- this.p=p;
- this.m=m;
- }
- }
- void answer(String s){
- println("Case #"+caze+": "+s);
- }
- void println(String s){
- System.out.println(s);
- }
- void print(String s){
- System.out.print(s);
- }
- void debug(Object... os){
- System.err.println(Arrays.deepToString(os));
- }
- public static void main(String[] args){
- try{
- System.setIn(new FileInputStream(
- "D:/contest_workspace/gcj_2011_round1b/dat/B-large.in"));
- System.setOut(new PrintStream(new FileOutputStream(
- "D:/contest_workspace/gcj_2011_round1b/dat/B-large.out")));
- }catch(Exception e){}
- new B().run();
- System.out.flush();
- System.out.close();
- }
- }
0 件のコメント:
コメントを投稿