HDU 1007
テーマの大意はこうです.
座標軸にいくつかの点を与え、これらの点の中で最も近い2つの点間の距離を求める.最終出力の結果は距離の半分です
分析:
これらの点を横座標に従って小さいから大きいまで並べ替え、同じであれば、縦座標に従って小さいから大きいまで並べ替えて、2点間の最小距離len 1を求める.
そして縦座標に従って小さいから大きいまで並べ替えて、同じなら横座標に従って小さいから大きいまで並べ替えて、2点ごとの間の最小の距離len 2を求めます;
最終的な結果はmin(len 1,len 2)である.
この問題は作成時に2つの問題に遭遇しました.
1.distance関数、名前の競合が発生し、解決策は自分でdistance参照を再定義する前に::、後者は直接distanceを名前に変更すればいい.
2.バブルソートを使い始めたばかりで、タイムアウトし、O(N*N)、改善方法はalgorithmのsortアルゴリズムを呼び出して、この問題を解決することです.
思考:sortアルゴリズムの時間の複雑さはいくらですか?
ここではsortとクイックソートを比較します.
std::sortで使用されるアルゴリズムは、ほとんどの場合quick sortアルゴリズムよりも速く、quick sortが遅い場合ほど顕著である.Quick sort平均はO(NlogN)であり,最悪の場合はO(N^2)である.std::sortはQuick sortの最悪の状況に対する改善であり、O(Nlogn)の複雑さを維持している.
しかし、この問題は後で感覚解法に問題があります.
座標軸にいくつかの点を与え、これらの点の中で最も近い2つの点間の距離を求める.最終出力の結果は距離の半分です
分析:
これらの点を横座標に従って小さいから大きいまで並べ替え、同じであれば、縦座標に従って小さいから大きいまで並べ替えて、2点間の最小距離len 1を求める.
そして縦座標に従って小さいから大きいまで並べ替えて、同じなら横座標に従って小さいから大きいまで並べ替えて、2点ごとの間の最小の距離len 2を求めます;
最終的な結果はmin(len 1,len 2)である.
この問題は作成時に2つの問題に遭遇しました.
1.distance関数、名前の競合が発生し、解決策は自分でdistance参照を再定義する前に::、後者は直接distanceを名前に変更すればいい.
2.バブルソートを使い始めたばかりで、タイムアウトし、O(N*N)、改善方法はalgorithmのsortアルゴリズムを呼び出して、この問題を解決することです.
思考:sortアルゴリズムの時間の複雑さはいくらですか?
ここではsortとクイックソートを比較します.
std::sortで使用されるアルゴリズムは、ほとんどの場合quick sortアルゴリズムよりも速く、quick sortが遅い場合ほど顕著である.Quick sort平均はO(NlogN)であり,最悪の場合はO(N^2)である.std::sortはQuick sortの最悪の状況に対する改善であり、O(Nlogn)の複雑さを維持している.
//
// main.cpp
// Demo
//
// Created by Jaster_chen on 1/27/16.
// Copyright © 2016 Jaster_chen. All rights reserved.
//
#include<iostream>
#include<iomanip>
#include<math.h>
#include<algorithm>
using namespace std;
struct Point
{
double x;
double y;
}P[100001];
double distance(Point P1, Point P2)
{
return sqrt(pow(P1.x-P2.x,2)+pow(P1.y-P2.y,2));
}
bool cmp1(const Point a,const Point b)
{
if(a.x<b.x)
return true;
if(a.x>b.x)
return false;
else
return a.y<b.y;
}
bool cmp2(const Point a,const Point b)
{
if(a.y<b.y)
return true;
if(a.y>b.y)
return false;
else
return a.x<b.x;
}
int main()
{
double len1,len2;
int N;
while(cin>>N&&N!=0)
{
for(int i=1;i<=N;i++)
{
cin>>P[i].x>>P[i].y;
}
sort(P+1,P+N+1,cmp1);
double min = ::distance(P[1],P[2]);
double dis;
for(int i=2;i<N;i++)
{
dis = ::distance(P[i],P[i+1]);
if(dis<min)
min = dis;
}
len1 = min/2.0;
sort(P+1,P+N+1,cmp2);
double Min = ::distance(P[1],P[2]);
double Dis;
for(int i=2;i<N;i++)
{
Dis = ::distance(P[i],P[i+1]);
if(Dis<Min)
Min = Dis;
}
len2 = Min/2.0;
if(len1>len2) len1 = len2;
cout<<fixed<<setprecision(2)<<len1<<endl;
}
return 0;
}
しかし、この問題は後で感覚解法に問題があります.
A(1,100),B(100,1),C(1,1),D(2,2).
① x , x , y , , len1。
:C(1,1),A(1,100),D(2,2),B(100,1).
CA 99,AD (1+98^2)( 98, 98 ),DB 98, AD DB 98, len1=98。
② y , y , x , , len2。
:C(1,1),B(100,1),D(2,2),A(1,100).
CB 99,BD 98,DA 98, BD DA 98, len2=98.
, :min(len1,len2), 98。
CD : 2, ,