分析:
题目的意思就是n个booths围成一个圈,然后你有一定数量的money,每个booth出售东西的价格已知,循环买,如果能买就支付,否则就跳过,直到全部不能。最后算出一共能买多少个东西。
第一次直接模拟,TLE。
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
#define maxn 200010
typedef long long ll;
using namespace std;
ll a[maxn];
ll minn,n,t;
int main()
{
std::ios::sync_with_stdio(false);minn=inf;cin>>n>>t;for(int i=0;i<n;i++){
cin>>a[i];if(minn>a[i]) {
minn=a[i];}}ll cur=0;ll cnt=0;ll ans=t/minn+1;// cout<<ans<<endl;while(1){
if(t>=a[cur]){
t-=a[cur];cnt++;}cur++;if(cur==n){
cur=0;}if(t<minn){
break;}}cout<<cnt<<endl;return 0;
}
第二次,发现是个循环,然后就计算出一个轮循所需要的钱,WA在test12处。
错误就在于第一轮轮循过后,有些地方就得跳过了。
#include <iostream>
#define inf 0x3f3f3f
#define maxn 200010
typedef long long ll;
using namespace std;
ll a[maxn],vis[maxn];
ll ans,ans1,ans2,sum,n,t,cnt;
int main()
{
std::ios::sync_with_stdio(false);cin>>n>>t;for(int i=0;i<n;i++){
cin>>a[i];}for(int i=0;i<n;i++){
if(a[i]>t) {
vis[i]=1;cnt++;}else{
sum+=a[i];}}ans1=t%sum;ans2=t-ans1;ans+=ans2/sum*(n-cnt);ll cur=0;while(1){
if(ans1>=a[cur]&&vis[cur]!=1){
ans++;ans1-=a[cur];}cur++;if(cur==n) break;}cout<<ans<<endl;return 0;
}
最后AC。
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f
#define maxn 200010
typedef long long ll;
using namespace std;
ll a[maxn];
ll ans,n,t,minn;
int main()
{
std::ios::sync_with_stdio(false);cin>>n>>t;minn=inf;for(int i=0;i<n;i++){
cin>>a[i];minn=min(a[i],minn);}while(t>=minn){
ll k=0;ll s=0;for(int i=0;i<n;i++){
if(t>=a[i]){
t-=a[i];s++;k+=a[i];}}ans+=s+t/k*s;t=t%k;}cout<<ans<<endl;return 0;
}