`
200830740306
  • 浏览: 109438 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

poj1723 数学问题

 
阅读更多
package middle;


import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;

/**
 * poj1723
 * 借鉴了别人的代码和思路
 * 一 士兵有多种移动方式
 * 通过适当的移动顺序和移动路线可以使得同一时刻不会有两名士兵站在同一点
 * 二 题目要求最佳移动方式(即求移动的最少步数)
 * 题目要求转化为求士兵站立的“最终位置”,即如何取“最终位置”使得士兵移动的步数最少(最优)
 * 因为移动步数可以分解为移动到同一直线,再移动到相邻位置,因此可以分开求
 * Y轴方向上的考虑(移动直线的时候)
 * 设目标坐标为M,即n个士兵最终需要移动到的Y轴的坐标值为M
 * n个士兵的Y轴坐标分别为:
 * Y0,Y1,Y2 …… …… Yn-1
 * 则最优步数S=|Y0-M|+|Y1-M|+|Y2-M|+ …… …… +|Yn-1-M|
 * 结论:M取中间点的值使得S为最少(最优)
 * X轴方向上的考虑
 * 首先需要对所有士兵的X轴坐标值进行排序
 * 然后,按从左至右的顺序依次移动到每个士兵所对应的“最终位置”(最优),所移动的步数总和就是X轴方向上需要移动的步数
 * 例,最左的士兵移动到“最终位置”的最左那位,第二个士兵移动到“最终位置”的第二位(好好理解下)
 * 则总的步数为:士兵一移动步数+士兵二移动步数+ …… +士兵n移动步数
 * 如何确定X轴方向上的最佳的“最终位置”?
 * 共n个士兵
 * 他们相应的X轴坐标为:X0,X1,X2 …… …… Xn-1
 * 设,士兵需要移动到的“最终位置”的X轴坐标值为:k,k+1,k+2 …… …… k+(n-1)
 * 则所求最优步数S=|X0-k|+|X1- (k+1) |+|X2-(k+2)|+ …… +|Xn-1-(k+(n-1))|
 * 经过变形S=|X0-k|+|(X1-1)-k|+|(X2-2)-k|+ …… …… +|(Xn-1-(n-1))-k|
 * 注意到公式的形式与Y轴方向上的考虑一样,同样是n个已知数分别减去一个待定数后取绝对值,然后求和
 * 因此还是采用取中位数的办法求得k值,最后算出最优解
 * @author NC
 */
public class Poj1723 {

    static int x[];
    static int y[];

    public static void main(String[] args) {
        Scanner scan = new Scanner(new BufferedInputStream(System.in));
        if (scan.hasNext()) {
            int n = scan.nextInt();
            x = new int[n];
            y = new int[n];
            for (int i = 0; i < n; i++) {
                x[i] = scan.nextInt();
                y[i] = scan.nextInt();
            }
            Arrays.sort(x);
            Arrays.sort(y);
            for (int i = 0; i < n; i++) {
                x[i] -= i;
            }
            Arrays.sort(x);
            int midX = x[(n + 1) / 2 - 1];
            int midY = y[(n + 1) / 2 - 1];
            int num = 0;
            for (int i = 0; i < n; i++) {
                num += Math.abs(x[i] - midX) + Math.abs(y[i] - midY);
            }
            System.out.println(num);

        }
    }
}
#include<stdio.h>
#include<iostream>
#include<queue>

using namespace std;
long x[10000], y[10000];

int main() {
    long i, n, num;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d %d", &x[i], &y[i]);
    sort(x, x + n);
    sort(y, y + n);

    for (i = 0; i < n; i++) {
        x[i] = x[i] - i;
    }
    sort(x, x + n); //再排序
     long midX = x[(n + 1) / 2 - 1];
    long midY = y[(n + 1) / 2 - 1];
    num = 0;
    for (i = 0; i < n; i++) {
        num += abs(x[i] - midX) + abs(y[i] - midY);
    }
    printf("%ld\n", num);
    return 0;
}
分享到:
评论

相关推荐

    POJ 1012 约瑟夫问题的数学解法及分析

    POJ 1012 约瑟夫问题的数学解法及分析POJ 1012 约瑟夫问题的数学解法及分析POJ 1012 约瑟夫问题的数学解法及分析

    组合数学 ACM 和,POJ里用到组合数学的题目

    "组合数学 ACM 和 POJ 里用到组合数学的题目" 组合数学是 ACM/ICPC 竞赛中一个非常重要的领域,它的应用非常广泛,涵盖了排列、组合、生成函数、Burnside 引理、Polya 定理等多个方面。在本文中,我们将对组合数学...

    北大POJ初级-数学

    【北大POJ初级-数学】是北京大学在线编程平台(POJ)上针对初学者设置的一系列数学相关的编程题目。这个解题报告集包含了对这些题目的深入解析和已通过(AC,Accepted)的代码实现,旨在帮助学习者提升在算法和编程...

    POJ算法题目分类

    * 组合数学:组合数学是指解决问题的组合数学算法,如 poj3252、poj1850、poj1019、poj1942。 * 数论:数论是指解决问题的数论算法,如 poj2635、poj3292、poj1845、poj2115。 * 计算方法:计算方法是指解决问题的...

    POJ2002-Squares

    在"POJ2002-Squares"这个问题中,参赛者可能需要编写一个程序来处理与正方形相关的数学问题。这可能涉及到计算和处理大量正方形,例如找出一个范围内的所有完全平方数,或者计算不同大小正方形覆盖区域的重叠部分。...

    poj题目分类

    * 模拟法:通过模拟问题的过程来解决问题,例如 poj1068、poj2632、poj1573、poj2993、poj2996。 2. 图算法: * 图的深度优先遍历和广度优先遍历:例如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 ...

    jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c

    标题中的"jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c" 提到了一个压缩文件,可能包含有关编程竞赛或算法解决的资源,特别是与POJ(Problem On Judge)平台上的问题3714相关的。"Ra_visual c"可能指的是...

    POJ2389-Bull Math

    1. "POJ2389-Bull Math.cpp":这是一个C++源代码文件,其中包含了解决"POJ2389-Bull Math"问题的算法实现。通过阅读这份代码,我们可以学习到作者是如何处理输入数据、如何设计并实现算法、以及如何组织代码结构的。...

    POJ3122-Pie

    这道题目通常被用于训练程序员的数据结构和算法技能,特别是解决数学问题的能力。在编程竞赛或者算法训练中,这类题目能够帮助参赛者提升逻辑思维和问题解决技巧。 【描述】"解题报告+AC代码"表示这个压缩包包含了...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **解释**:这一类问题通常涉及基本的数学运算和数学定理的应用。 #### 2. 几何问题 - **例题**:poj1328, poj2109, poj2586 - **解释**:这类题目涉及到几何图形的处理,比如点、线、面等的计算与判断。 #### 3....

    ACM-POJ 算法训练指南

    2. **数学归纳法**:通过归纳推理解决问题(poj2947, poj1487, poj2065, poj1166, poj1222)。 3. **GCD算法**:最大公约数算法的扩展应用(poj3101)。 以上知识点覆盖了ACM-POJ算法训练指南的主要内容,对于初学...

    POJ入门题库(含解题思路和答案)

    1. POJ——1004 Financial Management:这可能涉及到基础的数学计算和数据处理,如利润计算、利息计算等,可能需要用到循环结构和简单的数学公式。 2. POJ——1664 放苹果:此题可能需要理解数组操作和动态规划,...

    POJ题目分析与理解

    POJ(Peking University Online Judge)是一款在线评测系统,旨在帮助程序员提高编程能力和解决问题的能力。该系统提供了大量的编程题目,涵盖了算法、数据结构、数学、动态规划、博弈论等多个领域。通过解决这些...

    POJ1840-Eqs

    这道题目的全称可能是"Eqs",可能涉及数学或算法问题,通常在这样的在线判题系统中,题目会要求参赛者编写程序解决特定的计算或逻辑问题。 【描述】"解题报告+AC代码"表示这个压缩包包含了解题思路的报告以及已经...

    POJ1004-Financial Management

    在解决此类问题时,通常会使用C++等编程语言,因此`POJ1004-Financial Management.cpp`文件很可能包含了用C++编写的源代码。代码可能包含了读取输入、处理数据、计算结果和输出答案等核心功能。同时,`POJ1004-...

    poj训练计划.doc

    - 分治法:将一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,如`poj3295`。 - 递推:利用已知的基础条件和递推关系式来求解问题,通常用于解决序列问题。 - 模拟法:按照...

    poj各种分类

    例如,poj1328和poj2109就是典型的贪心问题。贪心算法的关键在于正确性证明,确保每一步的局部最优能够导向全局最优。 #### 分治法与递归 分治法是将大问题分解成若干个子问题,递归地求解这些子问题,然后将子问题...

    POJ3041-Asteroids

    在这个例子中,标签提示我们这可能是一个涉及动态规划、图论、数学或物理问题的算法题目。 【文件列表】: 1. "POJ3041-Asteroids.cpp":这是一个C++源代码文件,其中包含了参赛者编写的程序,用于解决"Asteroids...

    poj2775.rar_poj_poj 27_poj27_poj2775

    描述中提到的"递归经典题目"意味着这个题目可能涉及到递归算法,递归是一种函数或过程调用自身的技术,常用于解决分治策略的问题,如树遍历、排序(如快速排序、归并排序)和求解数学问题(如斐波那契数列)等。...

    POJ1017-Packets

    标题中的"POJ1017-Packets"指的是北京大学在线编程平台POJ(Problem Set of Peking University)上的第1017题,这是一道关于数据包处理的问题。题目通常要求参赛者编写程序来解决特定的算法或逻辑挑战。 在描述中...

Global site tag (gtag.js) - Google Analytics