zoukankan      html  css  js  c++  java
  • 1006—rect

    1006—rect

    题目:

    rect

     
     Accepts: 1682
     
     Submissions: 3028
     Time Limit: 2000/1000 MS (Java/Others)
     
     Memory Limit: 131072/131072 K (Java/Others)
    Problem Description

    度度熊有一个大小为 MX imes MYMX×MY 的矩形,左下角坐标为 (0, 0)(0,0),右上角坐标为 (MX, MY)(MX,MY)。此矩形内有 NN 个整数坐标的点 (x_i, y_i)(xi​​,yi​​),x_ixi​​ 彼此不重复,y_iyi​​ 彼此也不重复。

    现在要从每一个点画出一条线段,满足下列条件:

    • 线段起点为坐标点,终点在矩形范围的四个边界之一上。
    • 线段彼此不能交叉。

    现在要让画出的线段的长度总和最小,请输出这个最小的长度总和值。

    Input

    输入的第一行有一个正整数 TT,代表接下来有几笔测试资料。

    对于每笔测试资料: 第一行有三个整数 MXMX, MYMY 以及 NN。 接下来的 NN 行每行有两个正整数 x_ixi​​ 及 y_iyi​​。

    • 2 le MX, MY le 10^62MX,MY106​​
    • 0 le N le 10^50N105​​
    • 如果 i e jij,则保证 x_i e x_jxi​​xj​​ 及 y_i e y_jyi​​yj​​
    • 0 < x_i < MX0<xi​​<MX
    • 0 < y_i < MY0<yi​​<MY
    • 1 le T le 201T20
    • 至多 22 笔测试资料中的 N > 1000N>1000
    Output

    对于每一笔测试资料,请依序各自在一行内输出一个整数,代表可能的最小长度和。

    Sample Input
    2
    4 4 1
    2 2
    10 7 3
    6 3
    2 6
    9 5
    
    Sample Output
    2
    5

     

    思路:

         简单题,对于每个点,往上下左右找最短的垂线段,累加即可得到答案。

         注意:答案用超过int范围,应该用 long long 保存(我因此wa的一发)

    代码:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    int main()
    {
    
        int t;
        scanf("%d ",&t);
        while(t--){
            int mx, my, n;
            scanf("%d %d %d", &mx, &my, &n);
            long long ans = 0;
            for(int i=1;i<=n;i++){
                int x,y;
                scanf("%d%d", &x, &y);
                ans += (long long)min( min(x,mx-x),min(y,my-y) ); ///最短的垂线线段(往四个方向)
            }
            printf("%I64d
    ", ans);
        }
    
    
        return 0;
    }
  • 相关阅读:
    CPP(c++) google gflags
    CPP(c++) google gtest
    CPP(c++) google gmock
    CPP(c++) google glog
    CPP(c++) lambda
    CPP(c++) 多线程
    可以使退出终端后仍运行的命令行
    python下输出指定年月日的方法之一
    linux下时间相差8小时的问题
    C# 中结束阻塞模式的接收方法
  • 原文地址:https://www.cnblogs.com/longl/p/9465188.html
Copyright © 2011-2022 走看看