这道题就是个水题。。。。
题意:推箱子,只能往左推,不能推左下面的,推完后会产生链式反应左边的都被推,考虑重力下降。
思路:
箱子排布麻烦的只可能是左高右低,中间高和右边高直接往左推就完事了,也就是直接一平均,如果能整除分配到每一列,那就整除,如果不行,就+1处理,如果是左边高会麻烦,因为左边不能往右边推,所以我们从左开始判断,用前缀和从左遍历一次加一列,用ans更新最高的结果就可以了。
/*少说话,多做事*/ #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <sstream> #include <map> #include <set> #include <queue> #include <stdlib.h> using namespace std; #define ll long long int n; void solve() { scanf("%d",&n) ; //输入一共有多少列 ll ans = 0 ; ll cnt = 0 ; for(int i= 1 ; i <= n ; i++) { ll x; scanf("%lld",&x); //每一列有多少个方块 cnt+=x ; ll y =ceil((cnt+0.0)/i) ; //向上取整 ans = max(ans,y) ; } printf("%lld\n",ans) ; } int main() { int t; scanf("%d",&t); while(t--) { solve(); } }