有一個環形的市場,總共有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;
}