2 solutions

  • 0
    @ 2024-10-6 9:50:20

    本蒟蒻又来发题解了~ 这道题本质是一个贪心+模拟,模拟完答案就出来了。

    贪心的主要体现在于思想。 我们看到,如果想要每人获得均等糖果的最小代价,那就不要调整糖果数已经处于平均数的小朋友,移动时长度也要尽量的小

    附上代码:

    #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;
    }
    
    • 0
      @ 2023-12-12 21:44:13

      钓鱼

      • 1

      Information

      ID
      11
      Time
      1000ms
      Memory
      512MiB
      Difficulty
      8
      Tags
      # Submissions
      93
      Accepted
      13
      Uploaded By