题目

题目大意

一个三角形的网格图,三角形与其有共同边的三角形相连。

起点到所有终点的最短距离。


思考历程

数据看起来还挺大的,所以不是什么图论算法。

这显然是一个结论题。

什么结论?

然后我就开始推:

一个点(x,y)(x,y)(x,y),它可以到达(x,y−1)(x,y+1)(x,y-1)(x,y+1)(x,y−1)(x,y+1)。

如果yyy是奇数,那么可以到达(x+1,y+1)(x+1,y+1)(x+1,y+1),否则可以到达(x−1,y−1)(x-1,y-1)(x−1,y−1)

将其在平面直角坐标系中表示出来,得到一个很好看的图(懒得画了)。

感性地想出了一个式子,感觉上好像没什么问题,打了交上去。

结果60分……


正解

这个方法有很多。

假设起点是上面那个(反正边是双向的),现在它要往下走:

如果它是正三角形,意味着它可以直接往下走。

如果它是倒三角形,就将其向左或向右一个,那就是正三角形的情况了。

可以推推式子,求出它走最短距离到达终点那一行的左右边界。

所谓走最短距离,就是先往下走,然后向左或向右,继续向下……

如果终点在边界内,答案就是最短距离。否则走到终点那一行的左边界或右边界,然后左右移动到终点。

还有一种特别好的方法。

我们如果只考虑上下走,那么对于那两个点来说,不管怎样,一定会走它们层数之差的距离。

这是我们以(1,1)(1,1)(1,1)为端点的情况,那不妨考虑一下,将图旋转六十度,以(n,1)(n,1)(n,1)或(n,2n−1)(n,2n-1)(n,2n−1)为顶点。

所以我们只需要算出它们分别以三个顶点的层数之差,加起来,就是答案。

比较好理解,所以我的程序打的就是这种方法。


代码

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
int main(){
int n,m,sx,sy,sz;
scanf("%d%d%d%d",&n,&m,&sx,&sy);
sz=(sx*2-sy-1)/2+1,sy=(sy-1)/2+1;
int ansx,ansy,ans=2147483647;
for (int i=1;i<=m;++i){
int x,y,z,t;
scanf("%d%d",&x,&y);
t=abs(x-sx)+abs((y-1)/2+1-sy)+abs((x*2-y-1)/2+1-sz);
if (t<ans || t==ans && (x<ansx || x==ansx && y<ansy))
ansx=x,ansy=y,ans=t;
}
printf("%d %d\n%d",ansx,ansy,ans+1);
return 0;
}

总结

题目不要想得太复杂……

能用一个三角形来想的题目就不要傻傻地用平面直角坐标系来想……

[JZOJ1320] 【Usaco2009 gold 】拯救奶牛的更多相关文章

  1. Usaco 2010 Dec Gold Exercise(奶牛健美操)

    /*codevs 3279 二分+dfs贪心检验 堆版本 re一个 爆栈了*/ #include<cstdio> #include<queue> #include<cst ...

  2. BZOJ-USACO被虐记

    bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 1592: [Usaco2008 Feb]Making the Grade 路面修整 一开始没有想到离散化.然后离散化之后就 ...

  3. 不熟,不会,未a的题列表

    不熟: jzoj5968. 电竞选手(不知道公式如何得来) jzoj4877. [NOIP2016提高A组集训第10场11.8]力场护盾 (对向量不熟悉,不知道为什么结果要取反) jzoj4867. ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 6 November in 614

    Contest A. greet map,完了. B. gift map,完了. C. [Usaco2008 Nov Gold] 安慰奶牛 最小生成树.新边权设为原边权的两倍,再加上两端点的点权.完了 ...

  6. [USACO2009 NOV GOLD]奶牛的图片

    校内题,不给传送门了. 以前做完NOIp2013的火柴排队那道题后,当时很担心NOIp会出那种题,因为贪心的规则能不能看出来真的要看运气.但是这类题做多了后发现其实那道题的规则其实是很多题都已经用到了 ...

  7. BZOJ3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队

    3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 89  Solve ...

  8. 3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队

    3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 129  Solv ...

  9. BZOJ 3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队 动态规划

    3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=34 ...

随机推荐

  1. Cortex-M3的异常/中断屏蔽寄存器组

    转自 1. Cortex-M3的异常/中断屏蔽寄存器组 注:只有在特权级下,才允许访问这3个寄存器. 名 字 功能描述 PRIMASK 只有单一比特的寄存器.置为1后,就关掉所有可屏蔽异常,只剩下NM ...

  2. HDU1556-Color the ball-前缀和/线段树/树状数组

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

  3. solr添加IK分词和自己定义词库

    下载IK分词IK Analyzer 2012FF_hf1.zip 下载地址:http://yunpan.cn/cdvATy8899Lrw (提取码:c10d) 1.将IKAnalyzer2012FF_ ...

  4. 史上最全Html和CSS布局技巧

      单列布局水平居中 水平居中的页面布局中最为常见的一种布局形式,多出现于标题,以及内容区域的组织形式,下面介绍四种实现水平居中的方法(注:下面各个实例中实现的是child元素的对齐操作,child元 ...

  5. 史上最全Redis面试题及答案。

    花了大量时间整理了这套Redis面试题 首发50题,绝无仅有,从入门到精通 从基础,高级知识点,再到集群,运维,方案- 弄明白了这些题可以说可以成为面霸了 面试官都得折服,Redis学得怎么样,都来检 ...

  6. PyTorch中,关于model.eval()和torch.no_grad()

    一直对于model.eval()和torch.no_grad()有些疑惑 之前看博客说,只用torch.no_grad()即可 但是今天查资料,发现不是这样,而是两者都用,因为两者有着不同的作用 引用 ...

  7. sails中创建和使用services

    从sails官方在线文档查知 // EmailService.js - in api/services module.exports = { sendInviteEmail: function(opt ...

  8. vue条形码+二维码

    <template> <section style="height: 100vh;" class="bg"> <div class ...

  9. 2018-10-29-微软-Tech-Summit-技术暨生态大会课程-·-基于-Roslyn-打造高性能预编译框架...

    title author date CreateTime categories 微软 Tech Summit 技术暨生态大会课程 · 基于 Roslyn 打造高性能预编译框架 lindexi 2018 ...

  10. boost相关函数

    1.boost::scoped_ptr是一个比较简单的智能指针,它能保证在离开作用域之后它所管理对象能被自动释放 #include <iostream> #include <boos ...