BZOJ 1696 [Usaco2007 Feb]Building A New Barn新牛舍 数学
2015-08-19 07:14
555 查看
题意:链接
方法:数学+模拟
解析:
首先这类问题不是第一次见了,所以直接知道拿x的中位数,y的中位数。
这题就是讨论情况非常的烦。
题中有个限制,给出待求和的点不能选取。
所以如果奇数个点,求出x中位数,y中位数。
检验x,y是否存在待求和的点集里,如存在则判断四种情况。
判断的四种情况分别是(x-1,y),(x+1,y),(x,y-1),(x,y+1),次优解一定存在于这四种情况中,这个应该非常好理解?
如果不存在于原点集中,则直接求和。
如果偶数个点,则讨论所有x可取值以及y可取值即可,建议使用容斥。
至于细节,自己研究。
代码:
#include <map> #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 10010 #define INF 0x3f3f3f3f #define pa pair<int,int> using namespace std; int n; int a ; int b ; int xx[5]={0,-1,1,0,0}; int yy[5]={0,0,0,1,-1}; struct node { int x,y; }c ; 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<ans)ans=ret,cnt=1; else if(ret==ans)cnt++; } printf("%d %d\n",ans,cnt); } }else { int tmpx1=a[n/2],tmpx2=a[n/2+1]; int tmpy1=b[n/2],tmpy2=b[n/2+1]; int ret=0,cnt=(tmpx2-tmpx1+1)*(tmpy2-tmpy1+1); for(int k=1;k<=n;k++) { if(c[k].x>=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); } }
相关文章推荐
- UITextField 弹出键盘的外观(类型)设置
- Git Gui for Windows的建库、克隆(clone)、上传(push)、下载(pull)、合并
- 解题报告 之 HDU5301 Buildings
- HDOJ 5400 Arithmetic Sequence 暴力枚举
- UI基本控件
- easyui Droppable组件实现放置特效
- 自定义UITableViewCell 上的多个按钮点击事件处理
- 利用NStimer制作UILabel跑马灯效果
- 【3】工作队列queues
- LeetCode187——Repeated DNA Sequences
- hdu 5400 Arithmetic Sequence
- hdu5400--Arithmetic Sequence
- 搜索栏UISearchBar和UISearchController
- iOS8 UISearchViewController搜索功能讲解
- hdu 4010 Query on The Trees(动态树)
- UI_03 ⾃定义视图、视图控制器
- [hdu5400 Arithmetic Sequence]预处理,容斥
- 上传大文件,出现: 413 request Entity too Large错误的解决办法
- 可扩展的事件复用技术:epoll和kqueue
- Win7*64+androidstudio ndk-build.cmd finished with non-zero exit value 1 问题原因