POJ 3269 中位数

来源:互联网 发布:网络小贷 资金来源 编辑:程序博客网 时间:2024/06/15 07:39

题意:
这里写图片描述
这里写图片描述

思路:
这道题坑也不少。。 你准备好脑洞了么?

首先
要认真审题 题目中有说:“没有两头牛的吃草位置是相邻的”
这句话让我们省了很多的事儿 (Discuss里有的大神就入了这个坑了)

然后呢
自然想到了中位数 (不要问我怎么想到的)

但是如果n为偶数怎么办呢 就取两个中间位置的数那段区间呗~

本以为随便搞搞

n的取值 干啥 n为奇数 找到中间点 n为偶数 找到矩形区间

就像酱紫,就完了呢….

然而 我想简单了….

还有几步没有想到
1. 中间的那个点被牛占了怎么办
2. 矩形区间里面有牛怎么办

对于第一个问题
遍历它旁边的所有点(上下左右) 找到合适的点(可能是好几个)并统计
再重复一遍这句话“没有两头牛的吃草位置是相邻的”

对于第二个问题 判个重就OK了……

最后放一个毕克大爷的数据

这里写图片描述

(我跟他的结果一样 嘿嘿)
(不一样不就惨了嘛……)

//By SiriusRen #include <cmath>#include <cstdio>#include <algorithm>using namespace std;int n,xx[]={1,-1,0,0},yy[]={0,0,1,-1};struct Point{int x,y;}point[10005];bool cmp1(Point a,Point b){return a.x<b.x;}bool cmp2(Point a,Point b){return a.y<b.y;}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)        scanf("%d%d",&point[i].x,&point[i].y);    if(n&1){        int ans=0,l,r;        sort(point+1,point+1+n,cmp1);        int ansx=point[n/2+1].x;        sort(point+1,point+1+n,cmp2);        int ansy=point[n/2+1].y;        for(l=n/2+1;l>=1;l--)            if(point[l].y!=point[l-1].y)break;        for(r=n/2+1;r<=n;r++)            if(point[r].y!=point[r+1].y)break;        for(int i=l;i<=r;i++){            if(i==r) {                for(int i=1;i<=n;i++){                    ans+=fabs(point[i].x-ansx);                    ans+=fabs(point[i].y-ansy);                }                printf("%d 1\n",ans);                return 0;            }            if(ansx==point[i].x)goto end;        }        end:int answer=0x3ffffff,temp;        for(int i=0;i<=3;i++){            ans=0;            int tempx=ansx+xx[i];            int tempy=ansy+yy[i];            for(int i=1;i<=n;i++){                ans+=fabs(point[i].x-tempx);                ans+=fabs(point[i].y-tempy);            }            if(answer>ans)answer=ans,temp=1;            else if(answer==ans)temp++;        }        printf("%d %d\n",answer,temp);    }    else{        sort(point+1,point+1+n,cmp1);        int ansx=point[n/2].x,ans=0,ansx2=point[n/2+1].x,recs=0;        sort(point+1,point+1+n,cmp2);        int ansy=point[n/2].y,ansy2=point[n/2+1].y;        for(int i=1;i<=n;i++)            ans+=fabs(point[i].x-ansx),ans+=fabs(point[i].y-ansy);        for(int i=1;i<=n;i++)            if(point[i].x>=ansx&&point[i].x<=ansx2&&point[i].y>=ansy&&point[i].y<=ansy2)                recs++;        printf("%d %d\n",ans,(ansx2-ansx+1)*(ansy2-ansy+1)-recs);    }}

这里写图片描述

0 0
原创粉丝点击