版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/83650006
题意
n个售货车排成一个圈,编号1~n,每个售货车卖一种冰激凌,价格为a[i],数量无限,现在你有T块钱,从1号点出发,无限转圈,每到一个售货车,如果你能买一个冰激凌,那么一定买一个,否则不买,直到钱少到无法买冰激凌为止,问你能买多少个冰激凌
1<=n<=2e5,1<=T<=1e18,1<=a[i]<=1e9
思路
求一个圈的贡献,然后尽量把这个圈去掉,然后继续暴力下一个圈的贡献,去掉,一直到无法买冰激凌为止,最坏情况下T也是以2的幂次减少,所以总复杂度不会很高
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
typedef long long ll;
int n, a[maxn];
ll T;
int main() {
scanf("%d%I64d", &n, &T);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
ll ans = 0;
ll num = 0;
ll sum = 0;
for (int i = 1; i <= n; i++) if (a[i] <= T) {
T -= a[i];
ans++;
num++;
sum += a[i];
}
while (sum) {
ll circle = T / sum;
T -= circle * sum;
ans += circle * num;
num = 0;
sum = 0;
for (int i = 1; i <= n; i++) if (a[i] <= T) {
T -= a[i];
ans++;
num++;
sum += a[i];
}
}
printf("%I64d\n", ans);
return 0;
}