Berland Fair

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章