zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    动态改变Spring定时任务执行频率
    tomcat
    liunx命令
    idea 使用笔记
    redis 笔记
    学习笔记 Optional
    JPA Example 基本使用使用实例
    面试经验总结
    基于LAMP实现后台活动发布和前端扫码签到系统
    XV6源代码阅读-文件系统
  • 原文地址:https://www.cnblogs.com/guangheli/p/10959879.html
Copyright © 2011-2022 走看看