首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Codeforces 315A Music:歌曲下載與播放重啟次數

     編輯:關於C++

題目大意

  • 歌曲總長 `T` 秒,已下載 `S` 秒開始播放。
  • 播放速度 1x,下載速度 `(q-1)/q` x(即 `q` 秒實際時間下載 `q-1` 秒歌曲)。
  • 播放追上下載進度時重啟(已下載部分保留),求重啟總次數(含首次)。

數學建模

設重啟間隔為 `t` 秒實際時間。
播放進度:`S + t`(初始 `S` + 播放 `t` 秒)。
下載進度:`S + (q-1)/q * t`。
追上條件:`S + t = S + (q-1)/q * t + S`?不,正確建模:

第 1 次播放從 0 開始,下載進度初始 `S`。
經過 `t` 秒,播放位置 `t`,下載位置 `S + (q-1)/q * t`。
當 `t = S + (q-1)/q * t` → `t/q = S` → `t = S*q`。
此時下載位置 = `S + (q-1)S = S*q`。
若 `S*q ≥ T`,歌曲已下載完,不再重啟。
否則重啟,已下載長度變為 `S*q`,繼續同理。
即每次重啟後,已下載長度乘以 `q`。
計算最小 `k` 使 `S * q^k ≥ T`,答案 = `k`(含首次播放為第 1 次)。

代碼實現

#include 
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    long long T, S, q;
    while (cin >> T >> S >> q) {
        int ans = 0;
        while (S < T) {
            S *= q;
            ++ans;
        }
        cout << ans << "\n";
    }
    return 0;
}

複雜度

  • 循環次數 ≤ `log_q(T/S)` ≤ 30(`q≥2, T≤1e5`)。
  • 時間 O(log T),極快。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved