码迷,mamicode.com
首页 > 其他好文 > 详细

topcoder srm 683 div1 -3

时间:2017-06-08 20:33:37      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:coder   存在   abs   判断   前缀和   using   维护   div   std   

1、有$n$堆石子,组成一个环形。初始时第$i$堆石子有$a_{i}$.现在每次操作可以将一个石子从某一堆移动到相邻的堆上。问最少多少次操作可以使得最后第 $i$堆有$b_{i}$个石子?$1\leq n \leq 1000$

思路:肯定存在相邻两堆满足不会存在任何操作在这两堆之间进行。然后就成为一条链,那么只需要维护链的前缀和即可判断当前堆和前一堆之间需要多少次操作。

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
using namespace std;



class MoveStones
{
public:
	long long get(vector<int> a,vector<int> b)
	{
	    long long sum=0;
	    int n=(int)a.size();
	    for(int i=0;i<n;++i) sum+=a[i]-b[i];
	    if(sum) return -1;
	    if(n==1) return 0;
	    long long ans=1e16;
	    for(int i=0;i<n;++i)
        {
            long long pre=0;
            long long tmp=0;
            for(int j=1;j<=n;++j)
            {
                long long t=a[(i+j)%n]-b[(i+j)%n];
                tmp+=abs(pre);
                pre+=t;
            }
            ans=min(ans,tmp);
        }
        return ans;
	}
};

  

topcoder srm 683 div1 -3

标签:coder   存在   abs   判断   前缀和   using   维护   div   std   

原文地址:http://www.cnblogs.com/jianglangcaijin/p/6964535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!