标签:
原题传送门:https://vijos.org/p/%E6%B8%85%E5%B8%9D%E4%B9%8B%E6%83%91
雍正
求平面上最近的两点的距离,O(nlogn)算法实现,详解见 http://blog.csdn.net/lytning/article/details/25370169
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const double eps = 1e-8; const int INF = 0x7fffffff; int n; struct Point { double x, y; Point( double x = 0, double y = 0 ): x( x ), y( y ) {} bool operator < ( const Point& p ) const { if( x != p.x ) return x < p.x; else return y < p.y; } } p[200000 + 5], temp[200000 + 5]; bool cmpy( Point a, Point b ) { return a.y < b.y; } double Dis( Point a, Point b ) { return sqrt( ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) ); } double Closest_Pair( int left, int right ) { double d = INF; if( left == right ) return d; if( left + 1 == right ) return Dis( p[left], p[right] ); int mid = ( left + right ) >> 1; double d1 = Closest_Pair( left, mid ); double d2 = Closest_Pair( mid, right ); d = min( d1, d2 ); int k = 0; for( int i = left; i <= right; i++ ) { if( fabs( p[mid].x - p[i].x ) <= d ) temp[k++] = p[i]; } sort( temp, temp + k, cmpy ); for( int i = 0; i < k; i++ ) { for( int j = i + 1; j < k && temp[j].y - temp[i].y < d; j++ ) { double d3 = Dis( temp[i], temp[j] ); d = min( d, d3 ); } } return d; } int main() { cin >> n; for( int i = 0; i < n; i++ ) { double a, b; scanf( "%lf%lf", &a, &b ); p[i] = Point( a, b ); } sort( p, p + n ); printf( "%.3f", Closest_Pair( 0, n - 1 ) ); }
乾隆
简单来说,就是求rn的值,r为一个实数(我印象里poj也有一个这样的题吧》代码太丑,这里不贴了,主要是细节处理上的问题
顺治
深搜,对于每个点进行一次深搜,由于每个点最多访问1次,故时间复杂度为O(rc)
#include <algorithm> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #define MAXN 501 using namespace std; int dx[5]={0,-1,0,1,0}; int dy[5]={0,0,1,0,-1}; int r,c,p,t,ans; int m[MAXN][MAXN],f[MAXN][MAXN]; int search(int x,int y){ int t,tmp,nx,ny; if(f[x][y]>0) return f[x][y]; t=1; for(int i=1;i<=4;i++){ nx=x+dx[i],ny=y+dy[i]; if(nx>=1&&nx<=r&&ny>=1&&ny<=c&&m[x][y]<m[nx][ny]){ tmp=search(nx,ny)+1; if(tmp>t) t=tmp; } } f[x][y]=t; return f[x][y]; } int main() { cin>>r>>c; for(int i=1;i<=r;i++){ for(int j=1;j<=c;j++){ cin>>m[i][j]; } } for(int i=1;i<=r;i++){ for(int j=1;j<=c;j++){ t=search(i,j); f[i][j]=t; if(t>ans) ans=t; } } cout<<ans; return 0; }
康熙
这是该系列最难的一题。扩展欧几里得算法求线性方程的解(我写成这样 居然没有CE)
#include<iostream> #include<math.h> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; void gcd(long long a,long long b,long long &d,long long&x,long long &y){ if (b == 0){ d = a; x = 1; y = 0; }else{ gcd(b, a%b, d, y, x); y -= x*(a / b); } } int main(){ long long x1, x2, v1, v2,len; cin >> x1 >> x2 >> v1 >> v2 >> len; int dx, dv; v1 %= len; v2 %= len; x1 %= len; x2 %= len; if (v1 < v2){ swap(v1, v2); swap(x1, x2); } dv = v1 - v2; if (x1<x2){ dx = x2 - x1; } else{ dx = x2+len-x1; } long long d, k,p; gcd(dv,len, d,k,p); if (dx%d){ cout << "Impossible" << endl; } else{ dv /= d; len /= d; if (k > 0){ cout << (dx*k / d)%len << endl; } else{ cout << ((len + k)*dx / d)%len << endl; } } return 0; }
标签:
原文地址:http://www.cnblogs.com/oierforever/p/4764152.html