Official

A - Bridge and Sheets Editorial by camypaper


いくつかのシートに覆われていない区間に分割されることがわかります。 シートの長さが一定であることから、それぞれの区間について独立に同じ問題を解いてよいことが示せます。

以上より、問題は以下のように言い換えられます。

シートが全く設置されていない橋が nn 本あります。 ii 番目の橋の長さは lil_i です。 各橋について、橋全体を覆うのに必要なシートの最小枚数を求め、その総和を求めてください。

長さ ll の橋を覆うのに必要なシートの枚数は lW\lceil \frac{l}{W} \rceil です。よって i=1nliW\sum_{i=1}^{n}\lceil \frac{l_i}{W} \rceil を求めればよく、これは時間計算量 O(N)O(N) で求められます。

サンプルコード(C++)

Copy
  1. #include <iostream>
  2. #include <vector>
  3. using ll = long long;
  4. using namespace std;
  5. int main(){
  6. int n;
  7. cin>>n;
  8. ll L,w;
  9. cin>>L>>w;
  10. ll r = 0;
  11. vector<ll> a(n+1,L);
  12. for(int i=0;i<n;i++)cin>>a[i];
  13. ll ans = 0L;
  14. for(auto x:a)
  15. {
  16. if (x > r)
  17. ans += (x - r + w- 1) / w;
  18. r = x + w;
  19. }
  20. cout<<ans<<endl;
  21. }
#include <iostream>
#include <vector>

using ll = long long;
using namespace std;

int main(){
    int n;
    cin>>n;
    ll L,w;
    cin>>L>>w;
    ll r = 0;
    vector<ll> a(n+1,L);
    for(int i=0;i<n;i++)cin>>a[i];
    ll ans = 0L;
    for(auto x:a)
    {
        if (x > r)
            ans += (x - r + w- 1) / w;
        r = x + w;
    }
    cout<<ans<<endl;
}

posted:
last update:



2025-04-15 (Tue)
11:13:17 +00:00