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;
}
};