Uva 11300 Spreading the Wealth(数学,中位数)

探讨在一个圆形排列的村庄中,如何通过最小数量的货币转移使每位村民拥有的货币数量相等。利用nth_element函数快速找到中位数,实现高效计算。

 F. 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

    解题报告:《训练指南》上的一道好题。
    简单来说,就是有一组数,x[0]加1,x[1]则减1,x[2]则加1,依次类推。求min( abs(x[0] + abs(x[1]) + ... + abs{x[n-1])。
    做法呢,书上说的很明白了。关键时转化的过程实在是很巧妙,要好好感受一下。
    另外,可以用nth_element函数求中位数,比sort快。
    代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <vector>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define fff(i, n, m) for(int i=(n);i<=(m);i++)
#define ff(i, n) for(int i=0;i<(n);i++)
#define fout freopen
void work();
int main()
{
    #ifdef ACM
    fout("in.txt", "r", stdin);
    #endif

    work();
}

/////////////////////

LL w[1111111];
LL c[1111111];

void work()
{
    int n;
    while(~scanf("%d", &n))
    {
        ULL tot = 0;
        ff(i, n) scanf("%lld", w+i), tot+=w[i];

        LL avr = tot/n;
        c[0]=0;
        ff(i, n) c[i] = c[i-1] + w[i] - avr;

        nth_element(c, c+n/2, c+n);

        LL x = c[n/2];
        ULL ans = 0;
        ff(i, n) ans+=abs(x-c[i]);

        printf("%llu\n", ans);
    }
}


在计算流体动力学(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、付费专栏及课程。

余额充值