[jzoj 5775]【NOIP2008模拟】农夫约的假期 (前缀和+递推)
傳送門
Description
在某國有一個(gè)叫農(nóng)夫約的人,他養(yǎng)了很多羊,其中有兩頭名叫mm和hh,他們的歌聲十分好聽,被當(dāng)?shù)厝朔Q為“魔音”······
農(nóng)夫約也有自己的假期呀!他要去海邊度假,然而mm和hh不能離開他。沒辦法,他只好把他們兩個(gè)帶上。
到了海邊,農(nóng)夫約把他的羊放在一個(gè)(nn)的矩陣(有nn個(gè)方格)里。mm和hh十分好動(dòng),他們要走到m(m<=n*n)個(gè)地方,第i個(gè)地方的坐標(biāo)為(x[i](行),y[i](列)),每到一個(gè)地方他們會(huì)高歌一曲,制造q[i]點(diǎn)魔音值,因?yàn)樗麄兊哪б羰知?dú)特,他們的聲音只能橫著或豎著傳播。每傳播一格,魔音值會(huì)增加1。(傳播的格子數(shù)取最小的)接下來農(nóng)夫約要住酒店。為了方便照顧小羊們,他選的酒店的坐標(biāo)要在矩陣內(nèi)。但小羊們的魔音讓他十分頭疼。他想求出魔音值最小的地方。
他還要享受他的假期,所以他把這個(gè)任務(wù)交給你了,加油(^_^)。
Input
第一行輸入n、m和z。
接下來m行,每行3個(gè)正整數(shù)x[i],y[i]和q[i]。
Output
第一行一個(gè)整數(shù)表示魔音值最小是多少。
接下來一行兩個(gè)正整數(shù)zb1和zb2,表示魔音值最小的地方的坐標(biāo)(如果有多個(gè)答案,輸出橫坐標(biāo)最小的情況下,縱坐標(biāo)最小的)。
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%的數(shù)據(jù),n<=10(來自題目的饋贈(zèng)).
30%的數(shù)據(jù),n<=1000.
100%的數(shù)據(jù),0<n<=100000,0<m<=100000,0<z<=10,0<q[i]<=100.
Hint
題目保證z=1
Solution
可以暴力求出第一個(gè)點(diǎn)的,然后將它向后轉(zhuǎn)移
Code
//By Menteur_Hxy #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define int long long #define F(i,a,b) for(i=(a);i<=(b);i++) #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin)),p1==p2?EOF:*p1++) using namespace std;char buf[1<<20],*p1,*p2; inline int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f; }const int N=100010; int xid[N],yid[N],da[N],xls[N],yls[N];signed main() {freopen("shuru.in","r",stdin);freopen("shuru.out","w",stdout);int n,m,z,i,ans=0,xsum=0,ysum=0,xmi=1000000000000ll,ymi=1000000000000ll,xans,yans;n=read(),m=read(),z=read();F(i,1,m) xid[read()]++,yid[read()]++,ans+=read();F(i,1,n) xls[i]=xls[i-1]+xid[i],yls[i]=yls[i-1]+yid[i]; // F(i,1,n) printf("%d ",xls[i]);puts(""); // F(i,1,n) printf("%d ",yls[i]);puts("");F(i,1,n-1) xsum+=m-xls[i],ysum+=m-yls[i];F(i,1,n) { // printf("%lld %lld\n",xsum,ysum);if(xsum<xmi) xmi=xsum,xans=i;if(ysum<ymi) ymi=ysum,yans=i;xsum+=(xls[i]<<1)-m;ysum+=(yls[i]<<1)-m;}printf("%lld\n%lld %lld",ans+xmi+ymi,xans,yans);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/Menteur-Hxy/p/9451615.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的[jzoj 5775]【NOIP2008模拟】农夫约的假期 (前缀和+递推)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: var let this的区别
- 下一篇: hdu1814 Peaceful Com