博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1696 [Usaco2007 Feb]Building A New Barn新牛舍 数学
阅读量:6039 次
发布时间:2019-06-20

本文共 1344 字,大约阅读时间需要 4 分钟。

题意:

方法:数学+模拟

解析:

首先这类问题不是第一次见了,所以直接知道拿x的中位数。y的中位数。

这题就是讨论情况很的烦。

题中有个限制,给出待求和的点不能选取。

所以假设奇数个点,求出x中位数,y中位数。

检验x,y是否存在待求和的点集里,如存在则推断四种情况。

推断的四种情况各自是(x-1,y),(x+1,y),(x,y-1),(x,y+1),次优解一定存在于这四种情况中,这个应该很好理解?

假设不存在于原点集中。则直接求和。

假设偶数个点,则讨论全部x可取值以及y可取值就可以,建议使用容斥。

至于细节。自己研究。

代码:

#include  #include 
#include
#include
#include
#include
#define N 10010#define INF 0x3f3f3f3f#define pa pair
using namespace std;int n;int a[N];int b[N];int xx[5]={ 0,-1,1,0,0};int yy[5]={ 0,0,0,1,-1};struct node{ int x,y;}c[N];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i],&b[i]); c[i].x=a[i],c[i].y=b[i]; } sort(a+1,a+n+1),sort(b+1,b+n+1); if(n&1) { int tmp=n/2+1; int tmpx=a[tmp],tmpy=b[tmp]; int ans=0; int flag=1; for(int i=1;i<=n;i++) { if(tmpx==c[i].x&&tmpy==c[i].y){flag=0;break;} } if(flag) { for(int i=1;i<=n;i++) { ans+=abs(tmpx-a[i])+abs(tmpy-b[i]); } printf("%d 1\n",ans); }else { ans=INF; int cnt=0; for(int i=1;i<=4;i++) { int x=tmpx+xx[i],y=tmpy+yy[i]; int ret=0; for(int j=1;j<=n;j++) { ret+=abs(x-c[j].x)+abs(y-c[j].y); } if(ret
=tmpx1&&c[k].x<=tmpx2&&c[k].y>=tmpy1&&c[k].y<=tmpy2)cnt--; ret+=abs(tmpx1-c[k].x)+abs(tmpy1-c[k].y); } printf("%d %d\n",ret,cnt); }}

转载于:https://www.cnblogs.com/gavanwanggw/p/6973937.html

你可能感兴趣的文章
浅谈js闭包(closure)
查看>>
【regex】POSIX标准正则表达式库
查看>>
C#集成FastReport.Net并将模板保存到数据库
查看>>
python装饰器(decorator)两种模式探讨集合
查看>>
高级 DO 语法
查看>>
Jexus下配置多个站点
查看>>
Xcode编辑器的技巧与诀窍
查看>>
String、StringBuffer与StringBuilder之间区别
查看>>
工作第十三周:身体掏空,精神饱满
查看>>
Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
查看>>
ios扩展机制objc_setAssociatedObject,objc_getAssociatedObject
查看>>
批量添加-fno-objc-arc
查看>>
二叉树的层序遍历
查看>>
os模块
查看>>
安装 matplotlib
查看>>
css伪类(:before和:after)
查看>>
react native TypeError network request failed
查看>>
PLSQL锁表之后改如何操作
查看>>
Sql注入、文件上传与手机品牌信息抓取解决方案
查看>>
SQLServer跨库查询--分布式查询[转载]
查看>>