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;
}
原文地址:https://www.cnblogs.com/longl/p/9465188.html