물고기 문제 솔루션

물고기 문제 솔루션

우리는 각 물고기의 기여를 고려

숫자는 분명 직사각형 직사각형 / 총 수를 선택하여야한다

물고기

우리는 보통 물고기가 사각형 번호가 r에 * 연구이다 선택할 수 있음을 나타냅니다 [위에서 아래 연구에 오른쪽 R 왼쪽에서,

그러나 때로는 사각형의 크기에 의해 제한,

이때, X-R + 1 <1, X + R-1> N 또는 Y-R + 1 <1, Y + 또는 R-1> m,

직사각형 하한 분로부터 선택 될 수있다 (N-R + 1, x)는, 최대의 상한 (1, N-R + 1), 최소의 수직 길이 (N-R + 1, x)는 맥스 (1 X -r + 1) + 1 = 분 (N-R + 1, x)는 맥스 (0, XR)

유사하게, 좌우의 길이 분 (m-R + 1, Y) - 최대 (0 년), 즉, 수 (분 (N-R + 1, x)는 맥스 (0, XR)) × (최저 (m-R + 1, Y) - 최대 (0, 년)).

전체 구형 (R-N + 1) * (N-R + 1);

첫 번째 K 큰 사각형 격자를 선택 것으로 예상되는 원하는 프로그램 K 큰 물고기를, 선택, 더 중간에, 확실히 더 제한 직사각형 테두리, 우리는 중간에서 대부분의 주위에 확장 할 수도 있습니다.

코드 :

#include<bits/stdc++.h>
using namespace std;
const int N=100006,f[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
map<int,int> ha[N];
int n,m,r,k;
double ans=0.000;
struct xd{
   int x,y;
   double z;
   bool operator < (const xd &a) const {return a.z>z;}
}tmp,nw;
priority_queue<xd> q;
inline int read(){
   int T=0,F=1; char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();}
   while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar();
   return F*T;
}
int main(){
    n=read(),m=read(),r=read(),k=read();
    tmp.x=n/2+1,tmp.y=m/2+1,ha[tmp.x][tmp.y]=1,tmp.z=(min(n-r+1,tmp.x)-max(0,tmp.x-r))*(min(m-r+1,tmp.y)-max(0,tmp.y-r))*1.0000000000000/(n-r+1)*1.0000000000000000/(m-r+1),q.push(tmp);
    for(int i=1;i<=k;++i){
        tmp=q.top(),ans+=tmp.z,q.pop();
        for(int j=0;j<4;++j){
            nw.x=tmp.x+f[j][0],nw.y=tmp.y+f[j][1];
            if(nw.x<1||nw.x>n||nw.y<1||nw.y>m||ha[nw.x].find(nw.y)!=ha[nw.x].end()) continue;
            nw.z=(min(n-r+1,nw.x)-max(0,nw.x-r))*(min(m-r+1,nw.y)-max(0,nw.y-r))*1.0000000000000/(n-r+1)*1.0000000000000000/(m-r+1);
            q.push(nw),ha[nw.x][nw.y]=1;
        }
    }
    printf("%.10lf",ans);
    return 0; 
}
 

추천

출처www.cnblogs.com/ljk123-de-bo-ke/p/11318974.html