想离的圆(排序+二分查找)

Posted 小九

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想离的圆(排序+二分查找)相关的知识,希望对你有一定的参考价值。

题目:http://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=427658

先将圆的在X轴上左起点按升序排序,再用二分查找第一个起点比待查找圆的终点大的圆(即相离)

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class circle
    {
        int x,r,sta,end;
        circle(int x, int r)
        {
            this.x=x;
            this.r=r;
            this.sta=x-r;
            this.end=x+r;
        }
    }
public class N1278 {
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner cin=new Scanner(System.in);
        
        int n=cin.nextInt();
        circle c[]=new circle[n];
        for(int i=0;i<n;i++)
            c[i]=new circle(cin.nextInt(),cin.nextInt());
        Arrays.sort(c,new Comparator<circle>()
        {
            public int compare(circle c1,circle c2)
            {
                if(c1.sta>=c2.sta)
                    return 1;
                else
                    return -1;
            }
        });
        int sum=0;

        for(int i=0;i<n-1;i++)
        {
            int p=search(i,c,n);
            if(p!=-1)
                sum+=n-p;
        }
        System.out.print(sum);
    }
    public static int search(int pos,circle c[],int len)
    {
        int key=c[pos].end,begin=pos+1,last=len-1;
        while(begin<last)
        {
            int mid=(begin+last)/2;
            
            if(c[mid].sta>key)
                last=mid;
            else
                begin=mid+1;
        }
        if(c[begin].sta>key)
            return begin;
        else
            return -1;
    }

}

 

以上是关于想离的圆(排序+二分查找)的主要内容,如果未能解决你的问题,请参考以下文章

51NOD 1278 相离的圆(二分 + 排序)

51Nod1278 相离的圆

51nod 1278 相离的圆

51Nod 1278 相离的圆

二分查找和快速排序(理论+代码)

python实现二分查找与冒泡排序