BZOJ 1108: [POI2007]天然气管道Gaz 性质分析_小结论_巧妙

Description

  Mary试图控制成都的天然气市场。专家已经标示出了最好的天然气井和中转站在成都的地图。现在需要将中转
站和天然气井连接起来。每个中转站必须被连接到正好一个钻油井,反之亦然。 Mary特别指名,建设的天然气管
道必须从某个天然气井开始,向南或者向东建设。Mary想知道怎么连接每个天然气井和中转站,使得需要的天然气
管道的总长度最小。

Input

  第一行为一个正整数n(2<=n<=50000),表示天然气井的数量(中转站的数量与之相等)。接下来n行,每行两
个整数xi和yi(0<=xi,yi<=100000),表示天然气井的坐标。向东走则x坐标增加,向北走则y坐标增加。接下来n
行,每行两个数xj'和yj'(0<=xj',yj'<=100000),表示中转站的坐标。

Output

  第一行包含一个数,表示最短的连接管道长度。

 题解:

给人的第一感觉是贪心一下,将所有有需求的点按照横纵坐标排一个序,再贪心选择与其最近的供应点. 

这样做似乎有些麻烦.

我们列一列式子吧 !

所有点的标号是无关系的(我们想吧他们怎么标都是无所谓的)

那么,题中每一个中转站是恰好与一个油井配对的.

不难列出一下式子:

$ans=\sum_{i=1}^{m}x_{i}-x'_{i}+y'_{i}-y_{i}$ 我们希望对于每一个数组设定一个合理的顺序,使答案最小.

然而,仔细观察上式,发现顺序是无关的.

得 $ans=\sum_{i=1}^{m}x_{i}-\sum_{i=1}^{m}x'_{i}+\sum_{i=1}^{m}y'_{i}-\sum_{i=1}^{m}y_{i}$.
 
 

Code:

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)  
using namespace std;       
int main()
{
	// setIO("input"); 
	int n; 
	long long ans=0; 
	scanf("%d",&n); 
	for(int i=1;i<=n;++i)
	{
		int a,b;
		scanf("%d%d",&a,&b);    //x2 y2
		ans += b - a; 
	}
	for(int i=1;i<=n;++i)
	{
		int a,b; 
		scanf("%d%d",&a,&b);
		ans += a-b; 
	}
	printf("%lld",ans); 
	return 0;
}

  

posted @ 2019-06-01 15:55  EM-LGH  阅读(190)  评论(0编辑  收藏  举报