2 solutions
-
0
本蒟蒻又来发题解了~ 这道题本质是一个贪心+模拟,模拟完答案就出来了。贪心的主要体现在于思想。 我们看到,如果想要每人获得均等糖果的最小代价,那就不要调整糖果数已经处于平均数的小朋友,移动时长度也要尽量的小。
附上代码:
#include <bits/stdc++.h> #define SIZE 1000005 using namespace std; typedef long long ll; ll n,ave; ll a[SIZE],c[SIZE],x[SIZE],c_[SIZE],co[SIZE]; /**数组作用声明: a:用于存放小朋友的糖果数 c:每一段需要调整的糖果数 x:每两位小朋友之间传递的糖果数 c_:数组c的备份 co:前缀和数组 **/ ll long_abs(ll k)//注:cmath库里的abs是int类型 { if(k >= 0) return k; else return (-1 * k); } int main() { co[0] = 0; cin >> n; for(ll i = 1;i <= n;i++) { cin >> a[i]; co[i] = co[i - 1] + a[i];//计算前缀和 } ave = co[n] / n;//最终每个小朋友的糖果数 for(ll i = 1;i < n;i++) { c[i] = co[i] - ave * i;//变化量计算 c_[i] = c[i];//数据备份 } sort(c_ + 1, c_ + n);//按照变化量从小到大来排序操作 x[1] = c_[(n + 1) >> 1];//从中间来对两边进行调整 for(ll i = 2;i <= n;i++) x[i] = long_abs(x[1] - c[i-1]);//相邻之间传递数量 x[1] = long_abs(x[1]); ll ans = 0; for(ll i = 1;i <= n;i++) ans += x[i];//x[i]统计的是传递数,累加即可 cout << ans << endl; return 0; }
- 1
Information
- ID
- 11
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 8
- Tags
- # Submissions
- 93
- Accepted
- 13
- Uploaded By