牛客题解 武藏牌牛奶促销

链接:https://ac.nowcoder.com/acm/problem/13592
来源:牛客网

题解

作者 岛田小雅

看到这一题我第一反应想直接模拟,看了下范围感觉可行,但是如果遇到无法判断的 INF 就会导致 TLE。

那么怎么科学地判断它能不能无限续杯呢?

首先,因为小萌老师手里一开始一定有一个瓶子,而且他不能空手套白狼,所以我们能很轻易地得出只要一个瓶子或者一个盖子能换一瓶牛奶,小萌老师就可以无限续杯。

这样交一发,得到一个 TLE。

然后我造了下面的这个数据:

2 2 100 100

用这组数据调试会发现,瓶子和盖子可以互补。只要小萌老师一次用瓶子,一次用盖子,他就可以无限续杯。这种怎么判断呢?我懒得想。因为本题数据范围很小,我们可以换种思路。一旦出现重复的盖子和瓶子数量组合,说明小萌老师可以无限续杯。那么我们可以直接记录当前组合有没有出现过。如果遇到之前出现过的组合,就直接输出 INF。记录可以用 map,也可以用二维 bool 数组。

AC 代码

作者 岛田小雅
#include <bits/stdc++.h>
using namespace std;

int x, y, a, b;
int ans;

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    while(cin >> x >> y >> a >> b)
    {
        map<pair<int,int>,bool> mp; // 用map记录组合。如果用二维bool数组一定要每次循环清空它。
        if(x==1 || y==1) goto INF;
        ans = 0;
        while(a>=x || b>=y)
        {
            if(mp[pair<int,int>(a,b)]) goto INF;
            mp[pair<int,int>(a,b)] = true;
            ans++;
            a++, b++;
            if(a >= x) a -= x;
            else if(b >= y) b -= y;
        }
        cout << ans << '\n';
        continue;
        INF: cout << "INF\n";
    }
    return 0;
}
posted @ 2022-09-19 10:44  岛田小雅  阅读(22)  评论(0编辑  收藏  举报