虽然看起来每次遍历都需要O(n)得复杂度,但是因为每次都会剔除糖果
时间复杂度完全ok
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll n,m,a[maxn],sumn,ans,s[maxn];
bool com(ll a,ll b){ return a>b; }
int main()
{
cin >> n >> m;
for(int i=1;i<=n;i++)
{
cin >> a[i];
sumn+=a[i];
s[i]=a[i];
}
sort(s+1,s+1+n,com);
ll top=1,shu=n;
while(1)
{
for(int i=top;i<=n;i++)
{
if(m>=s[i]) break;//只要能选就行
top++,shu--,sumn-=s[i];
}
if(sumn==0||top==n+1) break;
if(m>=sumn)//能全部全掉就全部选
{
ans+=m/sumn*shu;
m%=sumn;
}
for(int i=1;i<=n;i++)//这里可以用树状数组二分来优化
{
if(m<a[i]) continue;
m-=a[i],ans++;
}
}
cout<<ans;
}