[JZOJ5775]【NOIP2008模拟】农夫约的假期

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

样例解释:(1,1)的初始魔音值为1,(1,2)的初始魔音值为1,(1,3)的初始魔音值为1,(1,1)与(1,2)的距离为1(abs(1-1)+abs(1-2)),传播过程中的魔音值为1*z=1。(1,2)与(1,2)的距离为0,传播过程中的魔音值为0,(1,3)与(1,2)的距离为1,传播过程中的魔音值为1。总魔音值为1+1+1+1+0+1=5。

 

Data Constraint

10%的数据,n<=10(来自题目的馈赠).
30%的数据,n<=1000.
100%的数据,0<n<=100000,0<m<=100000,0<z<=10,0<q[i]<=100.
 

Hint

题目保证z=1

 


 

 

貌似是标程出了锅, 只有z=1的情况23333.

所以找x的中位数, y的中位数作为答案, 就完了。

 


 

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
inline int read() {
    int res=0;char c=getchar();bool f=0;
    while(!isdigit(c)) {if(c=='-')f=1;c=getchar();}
    while(isdigit(c))res=(res<<3)+(res<<1)+(c^48),c=getchar();
    return f?-res:res;
}
int n, m , z;
int x[100005], y[100005], q[100005];
long long ans;
int ansx, ansy;

int main()
{
    freopen("shuru.in", "r", stdin);
    freopen("shuru.out", "w", stdout);
    n = read(), m = read(), z = read();
    for (register int i = 1 ; i <= m ; i ++) x[i] = read(), y[i] = read(), ans += (q[i] = read());
    sort(x + 1, x + 1 + m);
    sort(y + 1, y + 1 + m);
    ansx = x[(m+1)/2], ansy = y[(m+1)/2];
    for (register int i = 1 ; i <= m ; i ++) 
        ans += abs(ansx - x[i]) + abs(ansy - y[i]);
    printf("%lld\n%d %d\n", ans, ansx, ansy);
    return 0;
}

 

posted @ 2018-08-14 19:15  zZhBr  阅读(177)  评论(0编辑  收藏  举报