求大神教题

题目总版

ss_yangzirui @ 2024-11-05 17:01:21

题目描述 麻雀帕西和青蛙弗洛格是好玩伴,它们经常一起比赛唱歌。但冬天来了,青蛙弗洛格冬眠了,它的睡眠深度是 D。麻雀帕西觉得好无聊,于是它想办法要唤醒弗洛格。麻雀帕西只会唱 N 首歌,第 i 首歌的音量是 Si。每听完一首歌,青蛙弗洛格的睡眠深度就会减少,减少的值等于它听到的歌的音量。当青蛙弗洛格的睡眠深度大于 0 的时候,它会继续冬眠,当睡眠深度小于或者等于 0 时,它就会被唤醒了。麻雀帕西会从第 1 首歌开始唱,唱完第1 首歌后如果弗洛格还没醒就接着唱第 2 首歌,如果唱完第 2 首歌弗洛格还没醒就接着唱第 3 首歌,依次类推,如果唱完第 N 首歌后弗洛格还没醒,那么麻雀帕西又重新从第 1 首歌开始唱,就像循环播放音乐一样,一直到青蛙弗洛格被唤醒为止,那么麻雀帕西总共唱了多少首歌? 输入 第一行,两个整数: D 和 N。 第二行,N 个整数,空格分开,第 i 个整数就是第 i 首歌的音量 Si。 输出 一个整数,麻雀帕西总共唱了多少首歌后,弗洛格会被唤醒? 提示 【数据规模】 对 80%的数据,1 ≤ D ≤ 10000,1 ≤ N ≤ 50,1 ≤ Si ≤ 100。 另外 20%的数据,1 ≤ D ≤ 2000000000,1 ≤ N ≤ 50,1 ≤ Si ≤ 3。

输入样例 13 3 5 2 4 输出样例 4


by SSqwq_ @ 2024-11-05 19:01:05

@ss_yangzirui 帮你做完了。

直接减去循环节即可,时间复杂度 O(n)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans,n,d,sum,a[1000001];
void work(){
    cin>>d>>n;
    for(int i=1;i<=n;++i){
        cin>>a[i];
        d-=a[i];
        ans++;
        sum+=a[i];
        if(d<=0){
            cout<<ans<<"\n";
            return;
        }
    }
    ans+=(d/sum);
    d%=sum;
    for(int i=1;i<=n;++i){
        d-=a[i];
        ans++;
        if(d<=0){
            cout<<ans<<"\n";
            return;
        }
    }
}
signed main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int T=1;
//  cin>>T;
    while(T--){
        work();
    }
    return 0;
}

by ss_yangzirui @ 2024-11-06 12:13:34

@SSqwq_ 谢谢


|