加权中位数;
我们可以知道x和y坐标可以是独立的,就是我们可以先求出x坐标再求出y坐标;
先求出总人数sum;
先把每一个点按照x坐标排序,然后从左往右扫,把每一个点上的人数加和,一直到和>=(sum+1)/2退出,当前点的x坐标就是“避难所”的x坐标;
然后把每一个点按照y坐标排序,然后从左往右扫,把每一个点上的人数加和,一直到和>=(sum+1)/2退出,当前点的y坐标就是“避难所”的y坐标;
那么我们现在确定了这个点的位置,只需要计算就可以了;
还可以这样来理解:我们先求一下所有人 走到一条横着的线上最小是哪里,再求一下所有人走到一条竖着的线上最小是哪里,这一横一竖就能确定一个点的位置;
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; struct hp{ <span style="white-space:pre"> </span>int x,y,num; }a[200005]; long long n,m,t,i,sum,mid,b,xx,yy; double ans; int cmp1(hp a,hp b) { <span style="white-space:pre"> </span>return a.x<b.x; } int cmp2(hp a,hp b) { <span style="white-space:pre"> </span>return a.y<b.y; } int main() { <span style="white-space:pre"> </span>freopen("doomsday.in","r",stdin); <span style="white-space:pre"> </span>freopen("doomsday.out","w",stdout); <span style="white-space:pre"> </span>cin>>n>>m>>t; <span style="white-space:pre"> </span>for (i=1;i<=t;++i) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span> cin>>a[i].x>>a[i].y>>a[i].num; <span style="white-space:pre"> </span> sum+=a[i].num; } mid=(sum+1)/2; <span style="white-space:pre"> </span>sort(a+1,a+t+1,cmp1); <span style="white-space:pre"> </span>b=0; <span style="white-space:pre"> </span>i=0; <span style="white-space:pre"> </span>while (b<mid) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>i++; <span style="white-space:pre"> </span>b+=a[i].num; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>xx=a[i].x; <span style="white-space:pre"> </span>sort(a+1,a+t+1,cmp2); <span style="white-space:pre"> </span>b=0; <span style="white-space:pre"> </span>i=0; <span style="white-space:pre"> </span>while (b<mid) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>i++; <span style="white-space:pre"> </span>b+=a[i].num; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>yy=a[i].y; <span style="white-space:pre"> </span>ans=0; <span style="white-space:pre"> </span>for (i=1;i<=t;++i) <span style="white-space:pre"> </span> ans+=a[i].num*(abs(a[i].x-xx)+abs(a[i].y-yy))+0.00; <span style="white-space:pre"> </span>printf("%0.2lf",ans); <span style="white-space:pre"> </span>return 0; }
【犯的错误】
中间量会爆int,中间量必须开long long;窝开始就写了标算,结果就是因为开了int结果被卡成了30分;
woc被卡到30分的赶脚很不爽。。