topcoder srm 683 div1 -3
Posted Only the Strong Survive
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了topcoder srm 683 div1 -3相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章