zoukankan      html  css  js  c++  java
  • CSU 2136 ——湖南多校对抗赛 I

    2136: 统帅三军!

            Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 55     Solved: 11    


    Description

    Wells最近迷上了一款攻城的策略游戏,点就去就能当大元帅统帅三军!

    游戏界面主要是一个平面(坐标可以为浮点数),然而Wells发现这游戏是个骗局,其实只给了一个军队。

    Wells初始有一个军队,仅包含n个士兵,每个士兵有一个初始位置(x,y)和一个劳累指数Wi,每个队员可以移动,显然对于每个队员的移动是需要消耗一些体力的,若第i个队员从位置(x1,y1)移动到(x2,y2)的体力消耗为Wi*(|x2-x1|+|y2-y1|)。

    Wells希望先将队伍集合起来,且希望整个队伍一次集合的体力消耗越少越好。显然能量消耗的多少直接取决与Wells对于会和点(x,y)的选择,然而Wells太懒了,希望你帮他找出某个时刻的最佳会和点。

    Input

    对于每组数据:

    第一行:一个整数N,表示士兵数目。

    第二行:一共N个整数,其中的第i个数Wi表示第i个队员的劳累指数。(N<=106)(N<=106)

    接下来N行:每一行两个整数X和Y,表示第i个士兵的当前的横坐标和纵坐标。(109<=X,Y<=109)(−109<=X,Y<=109)

    Output

    一个实数。表示所有队员集合到最佳攻击位置的体力消耗总和,答案保留两位小数。

    Sample Input

    1
    1
    0 0
    

    Sample Output

    0.00

    Hint

    Source

    Author

    Wells

    题意:带权中位数

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn =1e6+5;
    struct data {
        int x,y,w;
    };
    data num[maxn];
    int n,i,j,k;
    double sum,ans,xx,yy;
    int xl,yl;
    int cmp(data a,data b) {
        return a.x<b.x;
    }
    int cmp1(data a,data b) {
        return a.y<b.y;
    }
    int main() {
        int T;
        ios::sync_with_stdio(false);
        cin.tie(0);
            cin>>n;
            sum=ans=xx=yy=0;
            for (i=1; i<=n; i++) {
                cin>>num[i].w;
                sum+=num[i].w;
            }
            for (i=1; i<=n; i++)
                cin>>num[i].x>>num[i].y;
            sort(num+1,num+n+1,cmp);
            double mid=sum/2;
            for (i=1; i<=n; i++) {
                xx+=num[i].w;
                if (xx>=mid) {
                    xl=num[i].x;
                    break;
                }
            }
            for (i=1; i<=n; i++)
                ans+=num[i].w*(abs(num[i].x-xl));
            sort(num+1,num+n+1,cmp1);
    
            for (i=1; i<=n; i++) {
                yy+=num[i].w;
                if (yy>=mid) {
                    yl=num[i].y;
                    break;
                }
            }
            for (i=1; i<=n; i++)
                ans+=num[i].w*(abs(num[i].y-yl));
            printf("%0.2lf
    ",ans);
        return 0;
    }
    View Code
    每一个不曾刷题的日子 都是对生命的辜负 从弱小到强大,需要一段时间的沉淀,就是现在了 ~buerdepepeqi
  • 相关阅读:
    iOS开发-ScrollView图片缩放
    算法-随机不重复数列生成
    iOS开发-舒尔特表
    iOS开发-音乐播放
    iOS开发-简单的图片查看器
    iOS开发-Interface Builder的前世今生
    iOS开发-DatePicker控件
    iOS开发-UI基础Demo
    Objective-C-Category类别
    Objective-C面向对象之实现类
  • 原文地址:https://www.cnblogs.com/buerdepepeqi/p/9138991.html
Copyright © 2011-2022 走看看