vijos p1882 智力题

题意:

清晨, 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("*****\n");
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\n",ans);
45     }
46 }

 

posted @ 2015-05-15 10:56  miao_a_miao  阅读(154)  评论(0)    收藏  举报