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 }

 

你可能感兴趣的:(OS)