poj 3039 Close Encounter

我的做法是找叉積與輸入最小的,其實應該就是1

然後在這些數中找與輸入最近的,做法也是線性的,但是我發現比sorting速度還慢。。。sorting 是nlogn的啊。

不過這個做法沒有貪心逼近好是真的

import java.io.*;
import java.math.BigInteger;
import java.util.*;

class node{
    int a, b; int t1,t2;
    public node(int x,int y){a=x;b=y;}
}
class problem{
    int a,b;
    node arr[] = new node[32767];
    void solver() throws IOException{
        Scanner scan = new Scanner(System.in);
        a = scan.nextInt(); b = scan.nextInt();
        double min = 99999;
        int count = 0;
        int n=0,m=0;
        for(int i=1;i<=32767;i++){
            if(i!=1&&i*b%a==0) continue;
            int f = (int) Math.floor(i*b*1.0/a);
            int c = (int) Math.ceil(i*b*1.0/a);
            if(a==1){f-=1;c+=1;}
            if(f<=32767&&Math.abs(f*a-i*b)<min) min = Math.abs(f*a-i*b);
            if(c<=32767&&Math.abs(c*a-i*b)<min) min = Math.abs(c*a-i*b);
        }
        for(int i=1;i<=32767;i++){
            if(i!=1&&i*b%a==0) continue;
            int f = (int) Math.floor(i*b*1.0/a);
            int c = (int) Math.ceil(i*b*1.0/a);
            if(a==1){f-=1;c+=1;}
            if(f<=32767&&Math.abs(f*a-i*b)==min) {arr[count++]=new node(i,f);}
            if(c<=32767&&Math.abs(c*a-i*b)==min) {arr[count++]=new node(i,c);}
        }
        for(int i=0;i<count;i++){
        	if(arr[i].a*1.0/arr[i].b - a*1.0/b<min){
        		min = arr[i].a*1.0/arr[i].b;
        		n=arr[i].a; m = arr[i].b;
        	}
        }
        System.out.println(n+" "+m);
    }
}
public class Main{
    public static void main (String [] args) throws Exception {
        problem p = new problem();
        p.solver();
    }
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章