P5016

 

 これは質問です、その質問を見ると恥ずかしかったです。

しかし、何度かタイトルを注意深く読んだ後、同じであることがわかりました。

この質問は非常に単純だと思います。最初に入力して、s1エンジニアをp1の位置に追加し、次にs2エンジニアをすべての兵舎に順番に列挙して配置し、両側の力の差を毎回計算して、最小値を取ります。

しかし、それを書いた後、コードがタイムアウトしました

タイムアウトの理由は単純すぎる

その理由は、パワーの違いが毎回カウントされるからです。

時間の複雑さはO(n ^ 2)O n 2 )です。

だから私は考えました

ドラゴンとタイガーの力の差を事前に計算するだけで、列挙するたびに新しい力の差を計算するだけです。

long longの祖先を表示しないという原則に従って、私が記述したACコードは次のとおりです。

#include <bits / stdc ++。h> 
#define max maxx 
#define min minn 
#define ll long long 
using using namespace std; 
ll n、c [100005]、m、p1、s1、s2、p2; 
ll lon、hu; 
ll max(ll a、ll b)
{ 
    if(a> b)return a; 
    それ以外の場合はbを返します。
} 
ll min(ll a、ll b)
{ 
    if(a <b)return a; 
    それ以外の場合はbを返します。
} 
int main()
{ 
    ll i; 
    cin >> n; 
    for(i = 1; i <= n; i ++)
        cin >> c [i]; 
    cin >> m >> p1 >> s1 >> s2; 
    c [p1] + = s1; 
    for(i = 1; i <m; i ++)
        lon + = c [i] *(mi); 
    for(i = m + 1; i <= n;
    if(lon == hu)
        cout << m << endl; 
    else if(lon <hu)
    { 
        p2 = m-(hu-lon)/ s2; 
        p2 = max(1、p2); 
        p2 = min(n、p2); 
        if(p2> 1 &&(abs(lon + s2 *(m-p2 + 1)-hu)<= abs(hu-lon-s2 *(m-p2))))
            cout << p2-1 << endl ; 
        それ以外の場合、cout << p2 << endl; 
    } 
    else 
    { 
        p2 = m +(lon-hu)/ s2; 
        p2 = max(1、p2); 
        p2 = min(n、p2); 
        if(p2 <n &&(abs(hu + s2 *(p2 + 1-m)-lon)<abs(hu + s2 *(p2-m)-lon)))
            cout << p2 + 1 << endl; 
        それ以外の場合、cout << p2 << endl; 
    } 
    0を返します。
}

 バイバイ!

おすすめ

転載: www.cnblogs.com/--840-114/p/12727460.html