1. 程式人生 > >Codeforces1073D——Berland Fair

Codeforces1073D——Berland Fair

第一圈讀取所有數字的時候就可以去除那些加上sum大於T的了
然後記錄去除後第一圈的和sum,直接取模
然後接下來也是重複同樣的操作,當迴圈一次之後沒有任何一個可以買的就退出while

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll T;
const int N=2*1e5+50;
int a[N];
bool vis[N];
int x;
int main(void){
    //freopen("data.txt","r",stdin);
    scanf("%d%lld"
,&n,&T); ll sum=0; int cnt=0; for(int i=0;i<n;i++){ scanf("%d",&x); if(sum+x<=T){ a[cnt++]=x; sum+=x; } } ll ans=0; if(sum>0){ ans=T/sum*cnt; T%=sum; } while(T){ bool flag=false; sum=
0; int tmp=0; for(int i=0;i<cnt;i++){ if(sum+a[i]<=T){ sum+=a[i]; tmp++; flag=true; } } if(!flag){ break; } ans+=(T/sum*tmp); T%=sum; } printf("%lld\n"
,ans); return 0; }