zoukankan      html  css  js  c++  java
  • 中位数总结

    主要是51nod上的中位数(距离之和最小):

    一:1096 距离之和最小

    是一道水题;

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using std::sort;
    int map[10010];
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&map[i]);
        sort(map+1,map+1+n);
    //    for(int i=1;i<=n;i++) printf("%d ",map[i]);
        int t=(n>>1)+1; 
    //    printf("std:: %d %d ",t,map[t]);
        long long ans=0;
        for(int i=1;i<=n;i++) 
        {
            if(i<=t) ans+=map[t]-map[i];
            else ans+=map[i]-map[t];
        } 
        printf("%lld",ans);
        return 0;
    }
    1096 距离之和最小

    二:1108 距离之和最小 V2

    主体上与上题一样,只是分成三维(tx,ty,tz);

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using std::sort;
    struct node
    {
        int x,y,z;
    } map[10010];
    bool cmpx(node a,node b){return a.x<b.x;}
    bool cmpy(node a,node b){return a.y<b.y;}
    bool cmpz(node a,node b){return a.z<b.z;}
    int abs(int x){if(x>=0) return x;else return -x;}
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d %d %d",&map[i].x,&map[i].y,&map[i].z);
        sort(map+1,map+1+n,cmpx);
        int tx=map[(n>>1)+1].x;
        sort(map+1,map+1+n,cmpy);
        int ty=map[(n>>1)+1].y;
        sort(map+1,map+1+n,cmpz);
        int tz=map[(n>>1)+1].z;
        long long ans=0;
        for(int i=1;i<=n;i++) 
        {
            ans+=abs(map[i].x-tx)+abs(map[i].y-ty)+abs(map[i].z-tz);
        } 
        printf("%lld",ans);
        return 0;
    }
    1108 距离之和最小 V2

    三:1110 距离之和最小 V3

    将一变得复杂(类似01背包与完全背包),将每个价值pi的点变成pi个点,那后与一相同(加上简单处理);

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using std::sort;
    struct node
    {
        long long  p,x;
    }map[10010];
    bool cmp(node a,node b) {return a.x<b.x;}
    long long abs(long long x){if(x>=0) return x;return -x;}
    int main()
    {
        int n;
        scanf("%d",&n);
        long long sum=0;
        for(int i=1;i<=n;i++) scanf("%lld %lld",&map[i].x,&map[i].p),sum+=map[i].p;
        long long t=(sum>>1)+1;
        sort(map+1,map+1+n,cmp);
    //    for(long long i=1;i<=n;i++) printf("std:: %d %d 
    ",map[i].x,map[i].p);     
    //    printf("std:: %d %d ",t,map[t]);
        long long tx=0,tsum=0;
        for(int i=1;i<=n;i++)
        {
            tsum+=map[i].p;
            if(tsum>=t) {tx=map[i].x;break;}
        }
        //printf("std:: %d %d %d %d ",sum,t,tx,tzi);
        long long ans=0;
        for(int i=1;i<=n;i++) 
            ans=ans+(abs(tx-map[i].x)*map[i].p);
        printf("%lld",ans);
        return 0;
    }
    1110 距离之和最小 V3

    总结:中位数应作为一种思维;

  • 相关阅读:
    热更新--动态加载framework
    封装framework注意点
    zip压缩和解压缩
    iOS 网络请求数据缓存
    tomcat服务器访问网址组成
    iOS--支付宝环境集成
    线程10--NSOperation的基本操作
    线程9--NSOperation
    线程8--GCD常见用法
    线程7--GCD的基本使用
  • 原文地址:https://www.cnblogs.com/12fs/p/7788922.html
Copyright © 2011-2022 走看看