当前位置: 代码迷 >> 综合 >> [Codeforces]1073DBerland Fair(模拟)
  详细解决方案

[Codeforces]1073DBerland Fair(模拟)

热度:64   发布时间:2023-11-08 15:09:25.0

分析:

题目的意思就是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;
}