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

 

  
posted @ 2018-08-14 21:14  kasiruto  阅读(92)  评论(0编辑  收藏