これは質問です、その質問を見ると恥ずかしかったです。
しかし、何度かタイトルを注意深く読んだ後、同じであることがわかりました。
この質問は非常に単純だと思います。最初に入力して、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を返します。 }
バイバイ!