题解:ABC281C - Circular Playlist
·题目
链接:Atcoder。
链接:洛谷。
·难度
算法难度:C。
思维难度:C。
调码难度:C。
综合评价:入门。
·算法
模拟+循环取模优化。
·思路
记从Song1至Songn循环一次所用时间为s,先统计出s,之后记t%s为p,即整数次循环做完后剩余的时间,在一次遍历i:1~n,维护q为从整数次循环做完开始到现在所用的时间,一旦q>=p,就说明最后播放的是Songi,输出i,然后计算播放的时间(如下)。
播放时间=总时间-未播放时间=a[i]-(q-p)。
·代价
妥妥的O(n)。
·细节
只有s、t、p、q需要long long。
·代码
#include<bits/stdc++.h>
#define N 110000
using namespace std;
long long s=0,t=0;
int a[N]={},n=0;
int main(){scanf("%d%lld",&n,&t);for(int i=1;i<=n;i++){scanf("%d",&a[i]);s+=a[i];}//输入并维护slong long p=t%s,q=0;//初始化p、qfor(int i=1;i<=n;i++){q+=a[i];//累加当前歌曲if(q>=p){printf("%d %d\n",i,a[i]-(q-p));//若已到时间就输出答案return 0;}}return 0;
}
·注意
输出答案后需要return 0。