• POJ 3269 中位数


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

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

    首先
    要认真审题 题目中有说:“没有两头牛的吃草位置是相邻的”
    这句话让我们省了很多的事儿 (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
    ",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
    ",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
    ",ans,(ansx2-ansx+1)*(ansy2-ansy+1)-recs);
        }
    }

    这里写图片描述

  • 相关阅读:
    Medium | LeetCode 148. 排序链表 | 归并排序(递归)
    Hard | LeetCode 4. 寻找两个正序数组的中位数 | 二分法
    Medium | LeetCode 341. 扁平化嵌套列表迭代器 | 递归 | 栈
    Hard | LeetCode 312. 戳气球 | 递归+记忆化数组 | 动态规划
    如何删除万能输入法
    javaweb 怎么获取路径
    Controller 返回 json那些小事
    螺旋矩阵
    javaweb怎么使用html
    tomcat中文乱码
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532327.html
Copyright © 2020-2023  润新知