生活随笔
收集整理的這篇文章主要介紹了
Codeforces Global Round 13 C
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C. Pekora and Trampoline
題意:對(duì)于數(shù)組a,每次出發(fā)開始可以選擇任意元素作為起始點(diǎn),然后在數(shù)組上移動(dòng),落點(diǎn)為i + a[i],直至超出數(shù)組范圍,每次經(jīng)過(guò)的點(diǎn)的值減一(先移動(dòng)再減/直至減到1為止),求使數(shù)組元素全為1所用最少的出發(fā)次數(shù)
數(shù)據(jù)范圍:數(shù)組大小n:[1,5000][1,5000][1,5000] 元素大小 a[i]:[1,109][1,10^9][1,109]
思路:模擬+優(yōu)化
首先觀察元素大小的最大值遠(yuǎn)高于數(shù)組大小上限,此時(shí)站在上面會(huì)直接超出數(shù)組范圍,直接模擬會(huì)多次重復(fù)該動(dòng)作消耗大量時(shí)間,因此可以對(duì)其超出數(shù)組范圍的部分批量一次性處理;
再者是數(shù)組不斷趨向全為1的狀態(tài),中間態(tài)的數(shù)組難免出現(xiàn)大量的連續(xù)的1,直接模擬經(jīng)過(guò)連續(xù)1時(shí)只能一步步走則會(huì)消耗大量時(shí)間,因此可以另開一個(gè)數(shù)組去對(duì)應(yīng)記錄當(dāng)該值為1時(shí)最終會(huì)跳那個(gè)非1的值的位置
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#define fastio() ios_base::sync_with_stdio(0);cin.tie(0);
typedef long long ll
;
const int N
= 5010;
int a
[N
], n
;
using namespace std
;void SetLeft(vector
<int>& b
, int j
)
{b
[j
] = b
[j
+ 1];for (int i
= j
- 1; i
>= 1; i
--){if (a
[i
] == 1) b
[i
] = b
[i
+ 1];else return;}
}int main()
{fastio();int t
;cin
>> t
;while (t
--){cin
>> n
;for (size_t i
= 1; i
<= n
; i
++) cin
>> a
[i
];ll ans
= 0;vector
<int> b(n
+ 2);b
[n
+ 1] = n
+ 1; for (int i
= n
; i
>= 1; i
--){if (a
[i
] != 1) b
[i
] = i
;else b
[i
] = b
[i
+ 1];}while (1){int beg
= b
[1]; if (beg
> n
) break; if (a
[beg
] > max(n
- beg
, 1)) {ans
+= a
[beg
] - max(n
- beg
, 1); a
[beg
] = max(n
- beg
, 1);if (a
[beg
] == 1) SetLeft(b
, beg
);continue;}int j
= beg
, k
;while (j
<= n
){if (a
[j
] == 1) k
= b
[j
]; else k
= j
+ a
[j
];if (a
[j
] == 2) SetLeft(b
, j
); a
[j
] = max(a
[j
] - 1, 1);j
= k
; }ans
++;}cout
<< ans
<< "\n";}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的Codeforces Global Round 13 C的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。