牛客网OJ题解--20210222

武藏牌牛奶促销

https://ac.nowcoder.com/acm/problem/13592

本系列记录翀翀😐痛苦的刷题日志,所有题目均来自于牛客网OJ题目,坚持刷题谈起来容易做起来难,希望我可以坚持下去,这里仍然分享一段励志文案:每个人都有梦想,然而有些人把梦想变成了现实,有些人的梦想依旧是梦想,只因为他们为梦想付出的努力程度不一样,他们坚持的时间不一样,最终才有这样的结果。

NC13592-武藏牌牛奶促销

题目链接

https://ac.nowcoder.com/acm/problem/13592

题目描述

武藏牌牛奶为了吸引顾客,推出优惠活动,可以使用x个空的瓶身,或者y个瓶盖,去商店换一瓶全新的武藏牌牛奶。注意,一瓶牛奶包含了瓶身和瓶盖。 现在小萌老师有a个空的瓶身和b个瓶盖,她想喝到尽可能多的牛奶,你知道她到底能喝到多少瓶完整的牛奶吗?多组输入 每组数据第一行包含4个正整数x y a b(1<=x,y,a,b<=100),意义见题目描述。对于每组数据,输出一行,表示小萌老师最多能喝多少瓶完整的牛奶。如果能喝无数瓶,输出"INF"(不要输出引号)。

测试样例

输入

1 3 1 1
4 3 6 4

输出

INF
4

说明

对于第二组测试样例,小萌老师有6个空的瓶身和4个瓶盖,她用4个瓶身和3个瓶盖换了2瓶牛奶并喝完,此时她就有4个空的瓶身和3个瓶盖。之后她再换2瓶牛奶并喝完,此时只有2个空的瓶身和2个瓶盖,就无法继续兑换了,所以答案是4

解题思路

对于有限次兑换,很简单,就是用空瓶和瓶盖尽可能多兑换就好了,只要注意每次兑换一瓶奶以后空瓶和瓶盖都会加1即可。难点在于无限次兑换的条件,有两个,一种是x=1或者y=1的情况即可,另一种是x=2&&y=2且a+b>2。

解题代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int x, y, a, b;
    while (cin >> x >> y >> a >> b)
    {
        int ans = 0;
        if ((x == 1 || y == 1) || ((x == 2 && y == 2) && (a + b >= 2)))
        {
            cout << "INF" << endl;
            continue;
        }
        else
        {
            //否则有限次兑换
            while (a >= x || b >= y)
            {
                //用x个瓶子兑换
                if (a >= x)
                {
                    int tmp1 = a / x;
                    a = a % x;
                    a += tmp1;
                    b += tmp1;
                    ans += tmp1;
                }
                //用y个瓶盖兑换
                if (b >= y)
                {
                    int tmp2 = b / y;
                    b = b % y;
                    a += tmp2;
                    b += tmp2;
                    ans += tmp2;
                }
            }
            cout << ans << endl;
        }
    }
    system("pause");
    return 0;
}

NC13253-子串

题目链接

https://ac.nowcoder.com/acm/problem/13253

题目描述

给出一个正整数n,我们把1..n在k进制下的表示连起来记为s(n,k),例如s(16,16)=123456789ABCDEF10, s(5,2)=11011100101。现在对于给定的n和字符串t,我们想知道是否存在一个k(2 ≤ k ≤ 16),使得t是s(n,k)的子串。第一行一个整数n(1 ≤ n ≤ 50,000)。 第二行一个字符串t(长度 ≤ 1,000,000)。"yes"表示存在满足条件的k,否则输出"no"

测试样例

输入

8
01112

输出

yes

解题思路

我们就是暴力枚举对于不同k进制下的1~n的字符串即可,难点在于要自己手写以下进制转换,同时最后要注意字符串是反的,需要手动翻转。最后再用find函数寻找子串即可。

解题代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    string t, s, tmp;
    cin >> n;
    cin >> t;
    //逐一尝试1~n的k进制串表示
    for (int k = 2; k < 17; k++)
    {
        //记录1~n的k进制串
        s = "";
        for (int i = 1; i <= n; i++)
        {
            //从1~n枚举整数值
            int num = i;
            //临时存储i的k进制串,最后不断拼接成为1~n的k进制串
            tmp = "";
            //使用循环取余的方法模拟转换进制
            while (num)
            {
                int cnt = num % k;
                if (cnt < 10)
                {
                    tmp += cnt + '0';
                }
                else
                {
                    //大于9的时候用ABCDE等表示
                    tmp += 'A' + cnt - 10;
                }
                num /= k;
            }
            //最后得到的是反的,要翻转一下字符串
            reverse(tmp.begin(), tmp.end());
            s += tmp;
        }
        //find()函数寻找子串在母串中出现的第一次位置,没有则返还-1
        if (s.find(t) != -1)
        {
            cout << "yes" << endl;
            system("pause");
            return 0;
        }
    }
    cout << "no" << endl;
    system("pause");
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务