問題P2512 [HAOI2008]キャンディ転送するソリューション

まず、我々はいくつかの使用する必要が平均カード(首長がこのアイデアスキップを理解している)のアイデアを:

セット$ a_iを$は、$ I $キャンディ子の元の量を表現します

$ $ AVEを設定し、子供のすべてのお菓子平均数を表し、

$ X_I $キャンディーは、左の子供の数は$ iのパスを$表します。すなわち:

①$ X_I> 0の場合:\クワッド$の$ iのパス$ X_I $キャンディを残した最初の2人の子供が$;

②それ以外の場合は、$ X_I <0の場合:私はパス$を残した最初の2人の子供を$ \クワッド$の$ | X_I | $キャンディ。

だから、問題は、コードは次のとおりです。

コード:


#include<cstdio>
int a[101];
int n,x,s;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        x+=a[i];
    }
    x/=n;
    for(int i=1;i<n;++i)
    {
        a[i]-=x;
        if(a[i]!=0)
        {
            ++s;
            a[i+1]+=a[i];
        }
    }
    printf("%d",s);
    return 0;
}

さて、今私たちは、元の質問に戻りましょう渡すお菓子アップ。

ただ、どのようなセットを見て:

セット$ a_iを$は、$ I $キャンディ子の元の量を表現します

$アヴェ$は、子供の数、すべてのキャンディの平均を表します

$ X_I $キャンディーは、左の子供の数は$ iのパスを$表します。

:式はタイトルによって得ることができる
$$
A_1 + X_2 = X_1-アベニュー
$$
$$
A_2 =アヴェ+ X_3-X_2
$$
$$
···
$$
$$
A_N、x_nに関する= X_1 +アヴェ
$$
即ち:

+ = X_I + 1 {}で$$ a_iを+ X_(1つの\ P <N)を取った$$

$$ A_N + X_1 + x_nに関する= AVE(I = N)$$

变形得:
$$
X_2 = AVE + X_1-A_1
$$
$$
X_3 = AVE + X_2-A_2 = AVE +(AVE + X_1-A_1)-A_2 = 2ave-A_1、A_2 + X_1
$$
$$
...
$ $
$$
X_1 = AVE + X_N-A_N = N・AVE-A_1-A_2- ... -A_n + X_1
$$

その後、我々はセットアップ:
$$
C_1-AVE = A_1
$$
$$
C_2 = A_1 + A_2-AVE
$$
$$
···
$$
$$
C_N A_1 + = + ... + A_N A_2・N-ave-
$$

それは設定しました:

$$ C_I = \ sum_ {J = 1} ^ iA_jイン・は、(C言語の\ K \ 1)を取った$$

あり:
$$
X_2 = X_1-C_L
$$
$$
X_3 = X_1-C_2
$$
$$
?????
$$
$$
X_N = X_1-C_N
$$

すなわち:

$$ X_I = X_1-C_I $$

その後、我々は要求を見に戻って、最小値を渡すためにあなたを必要とし、

すなわち、ある最小限必要
$$
| | X_1 | + | X_2 | +···+ | x_nに関する
$$
式に等しい
$$
X_1-C_L | | + | X_1-C_2 | +···+ | X_1 -C_n |
$$

それは求めています:

$$ MIN {\ sum_ {i = 1} ^ nX_iを} = MIN {\ sum_ {i = 1} ^ nX_1-C_I} $$

このように簡単に扱うために、知られている$ $ C_I上記の式を最小限に抑えるためには、(量は、少なくともプリアウトすることができます)、私たち$ $ C_Iは、数直線上の点として、問題は今に変換されます彼女の各$ C_I $上の距離と最小ポイント作り、$ X_1 $のポイントを見つけます。

もちろん、ポイントは中央値の$ n $点のことです。(しばらくした後、数学的証明を与えます)

次に、$ X_1 $を求める記載後
$$
X_2 = X_1-C_L
$$
$$
X_3 = X_1-C_2
$$
$$
···
$$
$$
x_nに関する= X_1-C_N
$$

私たちは、あなたが脱税を取得することができ、X_3 ... x_nに関する$、$ X_2を見つけることができます。この調理柿は、求めています:

最小化
$$
| X_1 | + | X_2 | +···+ | X_N |
$$

233人の友人~~~

良くも悪くもためのコードは、我々はqwqに対して何も持っていません。

コード:


#include<bits/stdc++.h>
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
#define inline il

typedef long long ll;
typedef long double ld;

const int inf = 0x7fffffff;
const int N = 1e6+1;

ll n;
ll a[N],c[N];
ll ave,ans,mid;

using namespace std;

int main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;++i)
        scanf("%lld",&a[i]),ave+=a[i];
    ave/=n;
    for(int i=1;i<=n;++i)
        c[i]=c[i-1]+ave-a[i-1];
    sort(c+1,c+n+1);
    mid=c[(n+1)/2];
    for(int i=1;i<=n;++i)
        ans+=abs(mid-c[i]);
    printf("%lld",ans);
    return 0;
}

付録:数学的な証明

n個の行の点の$ X $を見つけ、$ $点を有し、そして彼女各ポイントように最小距離。

証明:この数は、その時点で表現の$ n $数の中央値です。

我々は、最大、最小、小型で倍の二番目に大きいとオフペア数直線のポイントを取れば......

次いで、二つの中間点のそれぞれから最も近い点を指し

如果有奇数个点,那么显然中间那个点便为所求。

该点表示的数是这$n$个数的中位数得证。

注:有一些柿子在文中以不同的形式重复出现,主要是为了同时满足大佬和蒟蒻的需要。一些前面写了‘即…’并用

这个东西

框起来的一般是适合大佬的较严(bian)格(tai)数学写法,而其他的则是简明易懂的正常的、不变态的写法。

希望大家喜欢,点个赞哦:)

おすすめ

転載: www.cnblogs.com/oierwyh/p/11124180.html