牛客编程巅峰赛S2第7场

https://ac.nowcoder.com/acm/contest/9752

牛牛爱喝酒

题目描述

牛牛是一个酒鬼,非常爱喝酒,一瓶酒m元钱,两个酒瓶可以换一瓶酒,四个瓶盖可以换一瓶酒,现在有 n 元钱,求最多可以喝多少瓶酒?
(注:没有借贷功能,即最终不允许借一瓶酒、喝完后拿酒瓶兑换归还的操作)

示例1
输入

2,12

返回值

19

说明

牛牛总计可以喝19瓶酒

顺着题目的思路写 就行,看手中的酒瓶和瓶盖能否换一瓶酒。值得注意的是;该题只能用2个酒瓶换瓶酒或者4个瓶盖换一瓶酒,不能用一个酒瓶和2个瓶盖换一瓶酒。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回牛牛能喝的最多的酒
     * @param m int整型 酒单价
     * @param n int整型 牛牛的现金
     * @return int整型
     */
    int countWine(int m, int n) {
        // write code here
        int sum = 0;
        int n1,n2,n3;
        n1 = n/m;
        sum += n1;
        n2 = n1, n3 = n1;
        while(n2 >= 2 || n3 >= 4){
            int num = 0;
            if(n2>=2){
                num += n2 / 2;
                n2 %= 2;
            }
            if(n3 >= 4){
                num += n3 / 4;
                n3 %= 4;
            }
            n2 += num, n3 += num;
            sum += num;
        }
        return sum;
    }
};

牛牛的独特子序列

题目描述

牛牛现在有一个长度为len只包含小写字母‘a’-'z’的字符串x,他现在想要一个特殊的子序列,这个子序列的长度为3n(n为非负整数),子序列的第[1,n]个字母全部为‘a’,子序列的[n+1,2n]个字母全部为‘b’,子序列的[2n+1,3n]个字母全部为‘c’,牛牛想知道最长的符合条件的独特子序列的长度是多少。

示例1
输入

“cbacb”

返回值

0

说明

没有符合条件的非空子序列,所以输出0

二分:考虑答案的性质:如果x符合条件,那么<x的答案都符合条件;如果x不符合条件,那么>x的答案都符合条件。
二分范围:left = 0, right = length;
建议二分其中a/b/c的个数

写题的时候我是没想到二分的,后来听了题解才豁然开朗,同时也刷新了对二分的认知,以前的我总以为二分必须在有序的条件下使用,所以都要对数据先排一遍序,殊不知许多时候题目中天然存在有序的数列,等着你用二分。比如说这一题。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param x string字符串 
     * @return int整型
     */
    int Maximumlength(string x) {
        // write code here
        int len = x.size();
        
        int left = 0, right = len;
        int mid = (left+right)/2;
        int maxx=0;
        while(left <= right){
            mid = (left+right)/2;
            int na=0,nb=0,nc=0;
            for(int i=0;i<x.size();i++){
                if(x[i]=='a' && na<mid) na++;
                if(x[i]=='b' && nb<mid && na==mid) nb++;
                if(x[i]=='c' && nc<mid && nb==mid && na==mid) nc++; 
            }
            if(na==nb && nb==nc && nc==mid){
                maxx = max(maxx, mid);
                left = mid+1;
            }else{
                right = mid-1;
            }
            
        }
        return maxx*3;
    }
};

分贝壳游戏

题目描述

现在牛牛和牛妹一起出去海滩游玩,由于他们两个都不会游泳,所以他们在海滩捡了很多好看的贝壳,可是捡着捡着他们就感觉无聊了,所以他们决定拿这些贝壳玩一些游戏。
他们一共捡了n个贝壳,现在他们这n个贝壳放成一堆。然后轮流取贝壳,牛牛先取。牛牛一次能取[1,p]个贝壳,牛妹一次能取[1,q]个贝壳,能拿到最后一个贝壳的人赢
问牛牛和牛妹都足够聪明的情况下,最后谁能取得胜利
如果牛牛必胜,返回1
如果牛妹必胜,返回-1
如果没有人有必胜策略,返回0

示例1
输入

8,3,3

返回值

-1

如果p==q
n%(p+1)==0 : 牛妹胜
n%(p+1)!= 0 : 牛牛胜

p>q
n <= p : 牛牛胜
n = p+1:牛牛先取一个,然后无论牛妹取多少,牛牛都能一步取完
n>=p=1:那就无论如何n都会到<=p+1,并且牛妹取不走的那种

p<q
n<=p :牛牛胜,一步取完
其他情况:牛妹胜

class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @param p int整型 
     * @param q int整型 
     * @return int整型
     */
    int Gameresults(int n, int p, int q) {
        // write code here
        if(p==q){
            if(n%(p+1)==0) return -1;
            else return 1;
        }
        else if(p<q){
            if(n<=p) return 1;
            else return -1;
        }
        else return 1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值