JZOJ5775 农夫约的假期

Description
    在某国有一个叫农夫约的人,他养了很多羊,其中有两头名叫mm和hh,他们的歌声十分好听,被当地人称为“魔音”······
    农夫约也有自己的假期呀!他要去海边度假,然而mm和hh不能离开他。没办法,他只好把他们两个带上。
    到了海边,农夫约把他的羊放在一个(n*n)的矩阵(有n*n个方格)里。mm和hh十分好动,他们要走到m(m<=n*n)个地方,第i个地方的坐标为(x[i](行),y[i](列)),每到一个地方他们会高歌一曲,制造q[i]点魔音值,因为他们的魔音十分独特,他们的声音只能横着或竖着传播。每传播一格,魔音值会增加1。(传播的格子数取最小的)接下来农夫约要住酒店。为了方便照顾小羊们,他选的酒店的坐标要在矩阵内。但小羊们的魔音让他十分头疼。他想求出魔音值最小的地方。
    他还要享受他的假期,所以他把这个任务交给你了,加油(^_^)。
Input
  第一行输入n、m和z。
  接下来m行,每行3个正整数x[i],y[i]和q[i]。
Output
  第一行一个整数表示魔音值最小是多少。
  接下来一行两个正整数zb1和zb2,表示魔音值最小的地方的坐标(如果有多个答案,输出横坐标最小的情况下,纵坐标最小的)。
Sample Input
  3 3 1
  1 1 1
  1 2 1
  1 3 1
Sample Output
  5
  1 2
Data Constraint
  10%的数据,n<=10(来自题目的馈赠).
  30%的数据,n<=1000.
  100%的数据,0<n<=100000,0<m<=100000,0<z<=10,0<q[i]<=100.

Solution

  魔音增加的量其实是曼哈顿距离,所以横纵坐标互不影响,因为数据较小,所以暴力枚举横坐标和纵坐标。

 1 #include<cstdio>
 2 using namespace std;
 3 int n,m,x[1000000],y[1000000];
 4 long long s,l,r,z;
 5 int cc(int xx)
 6 {
 7     if (xx<0) return -xx;
 8     return xx;
 9 }
10 int main()
11 {
12     scanf("%d%d%lld",&n,&m,&z);
13     for (int i=1;i<=m;i++)
14     {
15         long long xx,yy,qq;
16         scanf("%lld%lld%lld",&xx,&yy,&qq);
17         x[xx]++;
18         y[yy]++;
19         l=l+xx-1;
20         r=r+yy-1;
21         s=s+qq;
22     }
23     l=l;r=r;
24     long long ll=l,rr=r;
25     int xx=1,yy=1;
26     for (int i=2;i<=n;i++)
27     {
28         x[i]=x[i]+x[i-1];
29         y[i]=y[i]+y[i-1];
30     }
31     for (int i=2;i<=n;i++)
32     {
33         l=l+x[i-1]*2-m;
34         if (l<ll) 
35         {
36             ll=l;
37             xx=i;
38         }
39     }
40     for (int i=2;i<=n;i++)
41     {
42         r=r+y[i-1]*2-m;
43         if (r<rr)
44         {
45             rr=r;
46             yy=i;
47         }
48     }
49     printf("%lld\n",s+ll+rr);
50     printf("%d %d\n",xx,yy);
51 }
View Code

 

  

转载于:https://www.cnblogs.com/Tokisaki-Kurumi/p/9477935.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
农夫过河问题可以使用深度优先搜索算法来解决。算法的主要思路是将问题抽象为图的遍历问题,通过不断尝试所有可能的移动方式,找到一种可行的解决方案。 具体步骤如下: 1. 定义初始状态和目标状态。初始状态为[, [1, 1, 1, 1]],表示农夫、狼、羊和蔬菜都在西岸。目标状态为[, [0, 0, 0, 0]],表示农夫、狼、羊和蔬菜都在东岸。 2. 创建一个空的栈,将初始状态以及一个空的移动历史列表作为元素入栈。 3. 进行深度优先搜索,直到栈为空或找到目标状态为止。 - 从栈中弹出一个状态,并获取其对应的移动历史。 - 判断该状态是否为目标状态,如果是则返回移动历史,问题解决。 - 否则,将当前状态拆分为农夫位置和其他物体位置两部分。 - 遍历所有可能的移动方式: - 如果农夫在西岸,他可以选择携带一样东西过河,因此需要遍历其他物体的位置。 - 如果农夫和其他物体在同一岸边,表示这个移动方式是不可行的,不做任何操作。 - 如果农夫和其他物体在不同岸边,表示这个移动方式是可行的,将农夫和其他物体同时移动到对岸,生成新的状态和移动历史,将其入栈。 - 如果农夫在东岸,他可以选择不携带任何东西过河,因此直接将农夫移动到对岸,生成新的状态和移动历史,将其入栈。 4. 如果栈为空,表示无法找到可行的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值