n 个糖果店,围成一圈。
店铺按顺时针顺序从 1 到 n 编号,n 号店铺与 1 号店铺相邻。
第 i 号店铺的单个糖果售价为 ai 元。
李华拿着 T 元钱去购买糖果,具体购买过程如下:
初始时,他位于 1 号店铺。
如果他现有的钱足够在当前店铺购买一个糖果,他就会立即购买一个糖果,否则他将不会在当前店铺购买糖果。随后,不论他是否在当前店铺购买糖果,他都会按顺时针顺序前往下一个店铺。
他将不断重复过程 2,直到剩余的钱在所有店铺都买不起糖果为止。
请问,最终李华一共购买到多少个糖果。
输入格式
第一行包含两个整数 n,T。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
一个整数,表示一共购买到的糖果数量。
数据范围
前 6 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤2×10^5,1≤T≤10^18,1≤ai≤10^9。
问题分析:具体的题意用代码都可以模拟出来,就是数据量大,O(n*(T/sum))量级会超时,要考虑优化问题。
……
有个小知识点:a>b>0,则有a%b<a/2
证明:首先当a>b>=a/2时,a%b<a/2;
其次if b<a/2时,a%b<b<a/2;
综上,a%b<a/2
……
Code:
#include<iostream>
using namespace std;
const int N=2e5+10;
int a[N];
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
unsigned long long n,t;
cin>>n>>t;
unsigned long long res=0;
for(int i=1;i<=n;++i){
cin>>a[i];
}
while(true){
unsigned long long cnt=0,all=0;
for(int i=1;i<=n;++i){
if(a[i]==-1)continue;
if(t>=a[i]+all){
all+=a[i];
cnt++;
}
else{
a[i]=-1;
}
}
if(!all)break;
res+=cnt*(t/all);
t%=all;
}
cout<<res;
}
t%all<t/2,每次都可以把t变成<t/2,时间复杂度为O(nlogt)级别不超时