貪欲アルゴリズム
タイトル: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.
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
まず、各点を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;
)
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.
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 OutputCase 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」<
}
else
{
for(i=0;i<sum;i+)
{
if(dao[i].y>len)
{
cout<<「Case」<
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」<
}
}
//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=x
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]
{
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<
return 0;
)