1. 程式人生 > >【 Educational Codeforces Round 53 (Rated for Div. 2) D. Berland Fair】思維題

【 Educational Codeforces Round 53 (Rated for Div. 2) D. Berland Fair】思維題

D. Berland Fair

題意

n

a [ i ]
T 有n個商品排列成一行,每個商品有一個加個a[i],最初你身上有T元
每次都從左到右走,如果買的起這個商品就買一件,買不起就不買
每次走到頭就重新從左端走,問最後能買到多少件商品
n < = 2 1 0 5      1 < = T < = 1 0 18 n<=2*10^5 \ \ \ \ 1<=T<=10^{18}

做法

T 由於T比較大,我們肯定要用到除法
n o w 每次我們統計當前可買的商品的價值總和now
T > n o w , 若T>now,則下次遍歷一次所有商品還是這麼買
否則我們就重新判斷當前可以購買哪些商品
T 但是我們要考慮所有商品都小於T,但是不能一起購買的資料
T 我們就要從前往後模擬一遍更新一次T
T 再重新統計所有小於T的商品的價值和
退 最後直到一個物品也購買不了退出迴圈

程式碼

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
ll a[maxn];
int main()
{
    int n;
    ll T;
    scanf("%d%lld",&n,&T);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    ll ans=0;
    while(T)
    {
        ll sum=0;
        ll cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]<=T)
            {
                cnt++;
                sum+=a[i];
            }
        }
        if(cnt==0) break;
        if(T<sum)
        {
            for(int i=1;i<=n;i++)
            {
                if(T>=a[i])
                {
                    ans++;
                    T-=a[i];
                }
            }
        }
        else
        {
            ans+=1LL*cnt*(T/sum);
            T=T%sum;
        }
    }
    printf("%lld\n",ans);
    return 0;
}