BZOJ_3210_花神的澆花集會_切比雪夫距離
阿新 • • 發佈:2018-05-06
abs type 算法 printf fabs inpu 簡單 class def
1 2
2 1
3 3
可以發現不合適度用的是切比雪夫距離。
於是把(x,y)變成(x-y,x+y)轉化為曼哈頓距離求解。
如果是曼哈頓距離就可以把橫縱坐標分開來求。
可以用數學方法證明排序後中位數最優。
但有可能答案(x,y)不能用原來坐標為整數的點表示。
出現這種情況需要用(x,y-1),(x,y+1),(x-1,y),(x+1,y)幾個點帶進去取個min。
代碼:
BZOJ_3210_花神的澆花集會_切比雪夫距離
Description
在花老師的指導下,每周4都有一個集會活動,俗稱“澆水”活動。
具體澆水活動詳情請見BZOJ3153
但這不是重點
花神出了好多題,每道題都有兩個參考系數:代碼難度和算法難度
花神為了準備澆花集會的題,必須找一道盡量適合所有人的題
現在花神知道每個人的代碼能力x和算法能力y,一道題(代碼難度X算法難度Y)對這個人的不適合度為 Max ( abs ( X – x ) , abs ( Y – y ) )
也就是說無論太難還是太簡單都會導致題目不適合做(如果全按花神本人能力設題,絕對的全場爆0的節奏,太簡單,則體現不出花神的實力)
當然不是每次都如花神所願,不一定有一道題適合所有人,所以要使所有人的不合適度總和盡可能低
花神出了100001*100001道題,每道題的代碼難度和算法難度都為0,1,2,3,……,100000
Input
第一行一個正整數N,表示花神有N個學生,花神要為這N個學生選一道題
接下來N行,每行兩個空格隔開的整數x[i],y[i],表示這個學生的代碼能力和算法能力
Output
一個整數,表示最小的不合適度總和
Sample Input
31 2
2 1
3 3
Sample Output
3HINT
對於100%的數據,n<=100000,0<=x[i],y[i]<=100000#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define N 100050 typedef long long ll; int xx[N],yy[N],n; ll ans; int fabs(int x){return x>0?x:-x;} ll solve(int x,int y) { ll re=0; int i; for(i=1;i<=n;i++) re+=fabs(xx[i]-x)+fabs(yy[i]-y); return re>>1; } int main() { scanf("%d",&n); int i,x,y; for(i=1;i<=n;i++) { scanf("%d%d",&xx[i],&yy[i]); x=xx[i],y=yy[i]; xx[i]=x-y; yy[i]=x+y; } sort(xx+1,xx+n+1); sort(yy+1,yy+n+1); x=xx[n+1>>1],y=yy[n+1>>1]; if(x%2==y%2) printf("%lld\n",solve(x,y)); else printf("%lld\n",min(solve(x-1,y),min(solve(x+1,y),min(solve(x,y-1),solve(x,y+1))))); }
BZOJ_3210_花神的澆花集會_切比雪夫距離