AcWing——糖果传递

Posted scau_igtim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing——糖果传递相关的知识,希望对你有一定的参考价值。

有 n个小朋友坐成一圈,每人有 a[i]个糖果。

每人只能给左右两人传递糖果。

每人每次传递一个糖果代价为 1。

求使所有人获得均等糖果的最小代价。

输入格式

第一行输入一个正整数 n,表示小朋友的个数。

接下来 n 行,每行一个整数 a[i],表示第 i个小朋友初始得到的糖果的颗数。

输出格式

输出一个整数,表示最小代价。

数据范围

1≤n≤1000000
0≤a[i]≤2×109
数据保证一定有解。

输入样例:

4
1
2
5
4

输出样例:

4

 题意:

ai向ai+1传递xi个通过(xi可正可负),求abs(x1)+abs(x2)+...+abs(xn)的最小值

分析:

一大堆数学证明我证不过来,所以直接给结论吧。

要求

|x1|+|x2|+...+|xn|最小值,

即求

|xn-b-a1|+|xn-2b-a1-a2|+|xn-nb-a1-a2-...-an|

将该问题转换为

货仓选址问题即可

#include <iostream>
#include <algorithm>

using namespace std;
typedef long long ll;
const int N=1e6+10;
ll a[N],b,c[N];
int main()
	int n;
	cin>>n;
	for(int i=1;i<=n;++i)
		cin>>a[i];
		b+=a[i];
		a[i]+=a[i-1];
	
	b/=n;
	for(int i=1;i<=n;++i)
		c[i]=i*b-a[i];
	
	sort(c+1,c+n+1);
	ll d=c[n/2+1];
	ll res=0;
	for(int i=1;i<=n;++i)
		res+=abs(c[i]-d);
	
	cout<<res;
	return 0;
 






Acwing第 61 场周赛完结

https://www.acwing.com/activity/content/competition/problem_list/2079/
T3,向量知识点有点忘了。

目录

4497. 分糖果

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
int main(void)

    LL t,a,b,c; cin>>t;
    while(t--)
    
        cin>>a>>b>>c;
        cout<<(a+b+c)/2<<'\\n';
    
    return 0;

4498. 指针【二进制枚举】

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=25;
int a[N],n,flag; 
int main(void)

	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<(1<<n);i++)
	
		int sum=0;
		for(int j=0;j<n;j++) 
		
			if(i>>j&1) sum=(sum+a[j])%360;
			else sum=(sum-a[j]+360)%360;
		
		if(!sum) flag=1;
	
	if(flag) puts("YES");
	else puts("NO");
    return 0;

4499. 画圆【计算几何】

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
int cmp(double x, double y)

    if (fabs(x - y) < eps) return 0;
    if (x < y) return -1;
    return 1;

int main(void)

    double r,x,y,x1,y1;
    cin>>r>>x>>y>>x1>>y1;
    double dx=x1-x;
    double dy=y1-y;
    double d=sqrt(dx*dx+dy*dy);
    if(cmp(d,r)>=0) printf("%.6lf %.6lf %.6lf",x,y,r);
    else 
    
        if(!cmp(x,x1)&&!cmp(y,y1)) printf("%.6lf %.6lf %.6lf",x+r/2,y,r/2);
        else
        
            double len=(r+d)/2;
            double ans1=x1+(x-x1)/d*len;
            double ans2=y1+(y-y1)/d*len;
            printf("%.6lf %.6lf %.6lf",ans1,ans2,len);
        
    
    return 0;

以上是关于AcWing——糖果传递的主要内容,如果未能解决你的问题,请参考以下文章

acwing1047. 糖果

AcWing 343. 排序

AcWing 4247. 糖果(差分约束最短路)

P2512 [HAOI2008]糖果传递

糖果传递(基于贪心的数学问题)

B1045 糖果传递 数学