1. 程式人生 > >JZOJ 5775. 【NOIP2008模擬】農夫約的假期

JZOJ 5775. 【NOIP2008模擬】農夫約的假期

文章目錄

題目:

傳送門

分析:

首先,關於這道題,有個很巧妙的ACAC方法:在AJAJ沒出資料前,機智的提交,即可用returnreturn 00成功ACAC 然後是認真的解法,這個就分為兩種了,一個是縊蟶dalaodalao的二維字首和,在此篇題解不做講解 最後,是我的玄學方法了: 根據題意,再加以理解,我們可以發現,求的是對於m個點曼哈頓距離最短的點位置 這樣我們求的就是所有點的平均座標值,大家也可以變成靈魂畫師,自己理解下 但為什麼可以,就不知道了,反正IOIIOI賽制不需要證明… 好吧,其實是可以證明(畢竟聽了梓豪的講評),但我懶呀

程式碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>  
#include<cstdlib>
#include<algorithm>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<list>
#include<ctime>
#include<iomanip>
#include<string> #include<bitset> #include<deque> #include<set> #define LL long long #define h happy #define ch cheap using namespace std; inline LL read() { LL d=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&
s<='9'){d=d*10+s-'0';s=getchar();} return d*f; } const int N=100001; LL n,m,z,sum,y[N],x[N],tp; int main(){ n=read();m=read();z=read(); for(int i=1;i<=m;i++){x[i]=read();y[i]=read();tp=read();sum+=tp;} int mid=ceil((double)m/2); sort(x+1,x+m+1);sort(y+1,y+m+1); for(int i=1;i<=m;i++) sum+=abs(x[i]-x[mid])+abs(y[i]-y[mid]); cout<<sum<<endl; cout<<x[mid]<<" "<<y[mid]; return 0; }