Uva 11300 Spreading the Wealth(递推,中位数)

本文解决了一个村庄里通过金币转移使每人持有相同金币数的问题。利用数学推导得出最优解为中位数,给出AC代码实现。

Spreading the Wealth

Problem

A Communist regime is trying to redistribute wealth in a village. They have have decided to sit everyone around a circular table. First, everyone has converted all of their properties to coins of equal value, such that the total number of coins is divisible by the number of people in the village. Finally, each person gives a number of coins to the person on his right and a number coins to the person on his left, such that in the end, everyone has the same number of coins. Given the number of coins of each person, compute the minimum number of coins that must be transferred using this method so that everyone has the same number of coins.

The Input

There is a number of inputs. Each input begins with n(n<1000001), the number of people in the village. n lines follow, giving the number of coins of each person in the village, in counterclockwise order around the table. The total number of coins will fit inside an unsigned 64 bit integer.

The Output

For each input, output the minimum number of coins that must be transferred on a single line.

Sample Input

3
100
100
100
4
1
2
5
4

Sample Output

0
4

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2275

题意:圆桌坐着N个人,每个人有一定的金币,金币总数能被N整除。每个人能给左右相邻的人一些金币,最终使得每个人的金币数目相等,求被转手金币数量的最小值。

设 xi表示i号给i-1号xi金币,若xi为负,这表示i-1号给i号(-xi)个金币

Ai表示i号一开始持有的金币

则:对与第1个人:A1-X1+X2=M  ===>X2=X1-(A1-M);令C1=A1-M

对于第2个人:A2-X2+X3=M ====>x3=x2-(A2-M) ====>x3=x1-(A1+A2-2M);===>x3=x1-C2;

……

对于第n个人:An-Xn+x1=M 这个是个恒等式,无用;

所以我们的答案应该是 |X1|+|X2|+|X3|+……+|Xn|的最小值;

====>|X1|+|X1-C1|+|X1-C2|+……+|Xn-1-Cn|的最小值

故当X1取C数组的中间值时,结果最小。。。

注意:|X1 – Ci|在数轴上就是x1到Ci的距离,所以问题变成了:给定数轴上的n个点,找出一个到它们的距离之和尽量小的点。

这个最优的X1就是这些数的“中位数”。即排序以后位于中间的数。至于证明大家自己搜索吧~

下面给出AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1000005;
 4 long long A[maxn],C[maxn],tot,M;
 5 int main()
 6 {
 7     int n;
 8     while(scanf("%d",&n)==1)//这里写EOF会超时,我也不知道咋回事
 9     {
10         tot=0;
11         for(int i=1;i<=n;i++)
12         {
13             scanf("%lld",&A[i]);
14             tot+=A[i];
15         }
16         M=tot/n;//求平均值
17         C[0]=0;
18         for(int i=1;i<n;i++)
19             C[i]=C[i-1]+A[i]-M;//有个递推公式,数学的博大精深啊!
20         sort(C,C+n);
21         long long x1=C[n/2];
22         long long ans=0;
23         for(int i=0;i<n;i++)
24             ans+=abs(x1-C[i]);
25         printf("%lld\n",ans);
26     }
27     return 0;
28 }

 

转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/6543590.html

在计算流体动力学(CFD)中,**DROPLET SPREADING**(液滴铺展)的模拟是研究液滴撞击固体表面后动态行为的重要方法。此类模拟广泛应用于喷墨打印、热喷涂、燃料喷射等领域。液滴铺展过程涉及复杂的自由表面流动、接触线动力学以及表面张力效应,因此对数值方法和物理模型的要求较高。 ### 模拟方法及软件实现 在CFD中,液滴铺展模拟通常采用两种主流方法: 1. **VOF(Volume of Fluid)方法**:适用于捕捉界面,尤其适合气液两相流动问题。VOF方法通过体积分数函数追踪液相分布,适合模拟液滴铺展过程中的界面演化[^1]。 2. **Level Set方法**:通过求解界面距离函数的偏微分方程来追踪界面,具有较好的曲率计算能力,适用于高精度表面张力建模。 此外,**OpenFOAM**中还支持**PLIC-VOF(Piecewise Linear Interface Calculation)**和**multiphaseEulerFoam**等多相流求解器,用于更复杂的液滴铺展模拟。 ### ANSYS Fluent 中的实现 在ANSYS Fluent中,液滴铺展模拟通常采用以下设置: - **多相流模型**:通常使用VOF模型,启用**Dynamic Mesh**或**Moving Mesh**以模拟液滴撞击后的变形。 - **表面张力**:通过**Continuum Surface Force (CSF)** 模型进行建模,需指定液滴与气体之间的表面张力系数。 - **接触角边界条件**:Fluent允许在壁面边界上设置动态接触角或静态接触角,用于模拟不同润湿性条件下的铺展行为[^1]。 - **网格自适应**:使用**Adaptive Mesh Refinement (AMR)** 提高液滴与壁面接触区域的分辨率,以提高计算精度。 示例设置如下: ```c // 设置VOF模型 Define -> Models -> Multiphase -> VOF // 设置表面张力 Define -> Boundary Conditions -> Surface Tension // 设置接触角 Define -> Boundary Conditions -> Wall -> Contact Angle ``` ### OpenFOAM 中的实现 OpenFOAM提供了多个求解器用于液滴铺展模拟,如**interFoam**、**multiphaseInterFoam**等。其核心设置包括: - **Transport Properties**:定义液相和气相的密度、粘度及表面张力系数。 - **Contact Angle模型**:在`constant/transportProperties`中配置润湿性参数,例如: ```cpp sigma 0.072; // 表面张力系数 contactAngle 60; // 接触角 ``` - **Mesh Motion**:可结合`dynamicMeshDict`设置动态网格以适应液滴变形。 - **Initial Conditions**:在`0/alpha.water`中设置初始液滴形状。 示例命令运行液滴铺展模拟: ```bash blockMesh setFields interFoam ``` ### 关键物理参数 液滴铺展模拟中需重点关注以下无量纲参数: - **韦伯数(Weber number, We)**:惯性力与表面张力之比,影响液滴铺展形态。 - **雷诺数(Reynolds number, Re)**:惯性力与粘性力之比,决定流动状态。 - **接触角(Contact Angle)**:决定表面润湿性,直接影响铺展半径和回缩行为。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值