Codeforces 1073D——暴力

版权声明:欢迎大家转载,转载请注明出处 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;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/83650006
今日推荐