有一个环形的市场,总共有n个摊位.
每个摊位的商品价格为a[i].
(n号摊位和1号摊位相邻).
现在小x从1号摊位开始,进行如下的购买策略:
1.如果他有足够的钱能够在第i号摊位购买它的商品,那么他就会买下该商品.
2.这之后,他会走到下一个摊位,如果当前摊位为n号,那么下一个摊位为1号摊位.
问如果小x初始的时候有T元钱的话,可以购买多少个商品.
Input
第一行两个整数n,T(1<=n<=2*10^5,1<=T<=10^18).
第二行有n个整数a1,a2...an(1<=ai<=10^9).
Output
输出一个整数,表示小x最后买下的商品的总数.
这个题当时比赛的时候,写的时间特别长,本来是直接整体求余在特判,但是T了好几次(特判时没有做到及时删除,导致时间复杂度很高)。活到老,学到老。
#include <iostream>
#include <list>
using namespace std;
list<long long> pp;
list<long long> ::iterator it;
int main(){
long long n,t,mm;
while(scanf("%lld %llld",&n,&t)!=EOF)
{ long long sum=0,ans=0,mmin=10000000;
for(int i=0;i<n;i++)
{
scanf("%lld",&mm);
sum+=mm;
pp.push_back(mm);
}
if(sum<t)
{
ans=n*(t/sum);
t-=(t/sum)*sum;
}
it=pp.begin();
while(!pp.empty())
{
if(t >= *it)
{
ans+=1;
t -= *it;
it++;
}
else
{ sum-=*it;
n--;
pp.erase(it++);
if(n==0)
break;
}
if(it==pp.end())
{
it=pp.begin();
if(sum<t)
{
ans+=n*(t/sum);
t-=(t/sum)*sum;
}
}
}
printf("%lld\n",ans);
}
return 0;
}