貪欲アルゴリズム


タイトル:http://poj.org/problem?id=1328
Description
Astsume the coasininininininininininininfinite staightline.Land isinininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininstststststststststststststststststststststst、sea.Esea、sea、sea、sea thethethethethethethethethethe coasasasasasasheheheheheheheat most d. 
We use Catesian coordiname system、defining the coasting is the x-axis.The sea side is above x-axis、and the land side below.Gven the position of each island in the sea、and given the distance the stars of darryour task is to write a program to find the minimal number of radar installation s to cover all the islands.Note that the position of an is represented by coordinans. 
贪心算法 | Poj1328_第1张图片 
Figure A Sample Input of Radar Installations
Input
The input consists of several test cases.The first line of each case contains two integers n(1<=n==1000)and d,where n is the number of islands in the sea a n d d is the distance of coverage of the radar installation.This is follows by lineach conting two integers representing the coordiname of the position of each land.The blows.Thers. 
The input is terminated by a line containing pair of zros 
Output
For each test case output one line consisting of the test case number follawed by the minimal number of radar installation need.「-1」installation meansのsolution for that case.
Sample Input
3 2
1 2
-3 1
2 1

1 2
0 2

0 0
Sample Output
Case 1: 2
Case 2: 1
基本的な考え方:
まず、各点をX軸に投影することによって、各点X軸Y軸の位置と最長レーダー距離を知ることができると思います.私たちは自然に各点をレーダーX軸上のある区間のレーダーによって探知できるからです.次に、最適化された解決策は、クラスターのアルゴリズムを利用して、区間の重なり合う点を一つのレーダーに統合するべきだと思います.階層クラスターの方法を採用しましたが、区間の重さによって点と点の類似度として、類似度の高い点からクラスターを開始しましたが、ずっとタイムアウトしました.時間を最適化する時、区間の重さを考慮しなくても簡単にできると考えています.だから、一番簡単な方法はすべてのポイント区間を並べて、重なりの店を増やして統合することです.
コード:
ヽoo.ツ..........................................................
ヽoo.ツ.........................................................
ヽoo.ツ...........................................................
using namespace std;
int sum,len
struct daoyu
{
 int x;
 int y;
} 
struct jiaodian
{
 double len;
 double rlen;

int cmp(jiaodian a、jiaodian b)
{
 return a.rlen>b.rlen;
)
int main()
{
 int i,count,cases=1;
 while(cin>>sum>>len&&sum!=0
 {
  count=1;
  daoyu*dao=new daoyu[sum]
  jiaodian*jiao=new jiaodian[sum]
  for(i=0;i<sum;i+)
      cin>>dao[i].x>>dao[i].y; 
  if(len<0)
  {
   cout<<「Case」<      cases++;
  }
  else
  {
   for(i=0;i<sum;i+)
   {
    if(dao[i].y>len)
    {
     cout<<「Case」<     cases++;
     break;
    }
   }
   if(i==sum)
   {
    for(int j=0;j<sum;j++)
    {
     double temp=sqrt((double);
     jiao[j].llen=(double)(dao[j].x-temp)
     jiao[j].rlen=(double)(dao[j].x+temp)
    }
    sort(jiao、jiao+sum、cmp)//xによって大きいから小さいまで並べます.
    double=jiao[0].llen;
    double r=jiao[0].rlen;
    for(int k=1;k<sum;k++)
    {
     if(jiao[k].rlen>=l)
     {
      if(jiao[k].llen>l)
      {
       l=jiao[k].llen
      }
      r=jiao[k].rlen
     }
     else
     {
      l=jiao[k].llen
      r=jiao[k].rlen
      count++;
     }
    }
    cout<<「Case」<    cases++;
   }
  }
 //scanf(");
 }
 return 0;
)
クラスターアルゴリズムのコード:(マージポイントの優先度は重ね合わせによって考慮されるが、時間オーバーヘッドが大きい)
ヽoo.ツ..........................................................
ヽoo.ツ..........................................................
using namespace std;
double Max(double a、double b)
{
return a>b?a:b
)
double Min(double a、double b)
{
return a)
int Matrix 2 Order(int x,int y,int len)
{
int a=xint b=x>y?x:y
return a*len-a*(a+1)/2+b-a-1;
)
int MatrixLen(int len)
{
return Matrix 2 Order(len-2,len-1,len)+1
)
int main()
{
int run=1
while(true)
{
int num
int dis;
cin>>num;
cin>>dis;
if(num==0&dis==0)
{
break;
)
int(*island)[2]=new int[num][2];
for(int i=0;i{
cin>>island[i][0]
cin>>island[i][1];
)
double(*range)[2]=new double[num];
for(int i=0;i{
double tmp=sqrt(((double)(dis*dis-island[i]、[1]*island[i])))
range[i][0]=island[i]、[0]-tmp;
range[i][1]=island[i]、[0]+tmp;
)
int*available N=new int[num]
int available C=num;
for(int a=0;a<num;a+)
{
available[a]=a
)
float*available M=new float[MatrixLen]
int Count=num
int j=0
int k;
for(;j{
for(k=j+1;k<available C;k+)
{
double tmpL=Max(range[available]N[j]、[0]、range[available N[k]]
double tmpH=Min(range[available]N[j]、[1]、range[available N[k]]
if(tmpL<=tmpH)
{
available M[Matrix 2 Order]=(double)(Max(range[available]N[j]、[1]、range[available][k]-[1]-Min(range[availableN[j][range]
)
else
{
available M[Matrix 2 Order]=-1
)
)
)
while(true)
{
double MinLikage=-1;
int MinX=-1
int MinY=-1
for(j=0;j<available C-1;j+)
{
for(k=j+1;k<available C;k+)
{
if(available M[Matrix 2 Order(available N[j],available N[k],num))!=-1)
{
if(MinLikage==-1)
{
MinLikage=availableM[Matrix 2 Order]
MinX=j;
MinY=k;
)
else if(MinLikage)available M[Matrix 2 Order(available N[j],available N[k],num])
{
MinLikage=availableM[Matrix 2 Order]
MinX=j;
MinY=k;
)
)
)
)
if(MinX!=-1&MinY!=-1)
{
Count-=1
int bigger=available N[MinX]>available N[MinY]?MinX:MinY;
int smaler=available N[MinX]if(biggar!=available-1)
{
available N[biggar]=available N[available-1] 
)
availableC-=1
range[available][0]=Max(range[available N[MinX],[0],range[available N[MinY]]
range[available][1]=Min(range[availableN[MinX],[1],range[available N[MinY]]
for(int n=0;n<available C;n++)
{
if(n!=smaler)
{
double tmpL=Max(range[available]N[n],range[available]
double tmpH=Min(range[available]N[n],range[available]
if(tmpL<=tmpH)
{
available M[Matrix 2 Order]=(double)(Max(range[available][n],range[available]、[1]-Min(range[available])[available]
)
else
{
available M[Matrix 2 Order]=-1
)
)
)
)
else
{
break;
)
)
std::cout<<「Case」
std::cout<std::cout<<「:」
std::cout<)
return 0;
)