题意:
清晨, Alice与Bob在石阶上玩砖块.
他们每人都有属于自己的一堆砖块.
每人的砖块都由N列组成且N是奇数.
Alice的第i列砖块有m[i]个.
而Bob的第i列砖块有s[i]个.
他们想建造城堡, 两座一样的城堡.
每一座城堡都是从正中间一列开始:
1)若往左侧看去,数量逐次增加,每一列都比右侧的一列多出恰一块砖.
2)若往右侧看去,数量逐次增加,每一列都比左侧的一列多出恰一块砖.
那么,最左侧与最右侧的高度当然是一样的呵.
每一次.
他们可以扔掉一块砖头,以减少某一列的砖头数量.这算是一次操作.
他们可以再找一块砖头,以增加某一列的砖头数量.这又算是一次操作.
但是.
不能从一列去除一块砖头,再放置到别的列中.
被扔掉的砖头,永远也不能再被使用.
最少,最少,需要多少次操作?
链接:点我
从中间开始减去应该少的高度,最后就是求使所有数字都相同的步骤,而那个相同的数字就是中位数
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("***** "); 14 const int MAXN=300005; 15 int n,m,tt; 16 long long a[MAXN],b[MAXN],o[MAXN*2]; 17 int main() 18 { 19 int i,j,k; 20 while(scanf("%d",&n)!=EOF) 21 { 22 for(i=1;i<=n;i++) scanf("%I64d",a+i); 23 for(i=1;i<=n;i++) scanf("%I64d",b+i); 24 int mid=(1+n)/2; 25 for(i=1;i<=mid;i++) 26 { 27 a[mid-i]-=i; 28 a[mid+i]-=i; 29 b[mid-i]-=i; 30 b[mid+i]-=i; 31 } 32 for(i=1;i<=n;i++) 33 { 34 o[i]=a[i]; 35 o[i+n]=b[i]; 36 } 37 sort(o+1,o+2*n+1); 38 long long q=o[n]; 39 long long ans=0; 40 for(i=1;i<=2*n;i++) 41 { 42 ans+=fabs(q-o[i]); 43 } 44 printf("%I64d ",ans); 45 } 46 }