[牛客网]游游的you 算法题

一、题目

题目链接游游的you__牛客网

题目描述:

游游现在有a个'y',b个'o',c个'u',他想用这些字母拼成一个字符串。

三个相邻的字母是"you"可以获得2分,两个相邻的字母是"oo",可以获得1分。

问最多可以获得多少分?

输入描述:

第一行一个整数qqq,代表询问次数。

接下来qqq行,每行三个正整数a,b,ca,b,ca,b,c,用空格隔开。


1≤q≤10^{5}
1≤a,b,c≤10^{9}

输出描述:

输出qqq行,代表每次询问的答案。


示例1:

输入
3
1 1 1
2 3 2
1 5 2


输出
2
4
5

说明:
第一次询问,可以拼出"you",获得2分。

第二次询问,可以拼出"oyouyou",获得4分。

第三次询问,可以拼出"uooooyou",获得5分。

二、思路解析


这道题也是利用到了 贪心 的思想。

通过题目我们可以得知:三个相邻的字母是"you"可以获得2分,两个相邻的字母是"oo",可以获得1分。

所以为了得到最高分,我们应该尽量多的拼出“you”, 其次是相邻的“oo”。

  • 可以拼出的最多“you”取决于a, b, c 中的最小值;
  • 可以拼出的最多的“oo”,取决于拼出you 后剩余的o的个数。 如果a,b,c 中的最小值为x, 则“oo”的数量为b-x 。
  • 需要特别注意 o 的个数为最小值的情况。
  • 最后输出得分即可。

三、完整代码

java 版本:

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int q = in.nextInt();
        int a, b, c;
        int x, y;
 
        while(q-- != 0){
            a = in.nextInt();
            b = in.nextInt();
            c = in.nextInt();
 
            x = Math.min(a, Math.min(b, c)); ##可拼出的"you"的个数
            y = Math.max(b - x - 1, 0); ##可拼出的“oo”的个数
            System.out.println(x * 2 + y);
        }
 
    }
}

php 版本:

## 版本一
fscanf(STDIN, "%d", $q);
for ($i = 0; $i < $q; $i++) {
    fscanf(STDIN, "%d %d %d", $a, $b, $c);
    $x = min($a, $b, $c);
    $y = max($b - $x - 1, 0);
    echo 2 * $x + $y . PHP_EOL;
}

##版本二
$q = (int)fgets(STDIN);
for ($i = 0; $i < $q; $i++) {
    list($a, $b, $c) = array_map('intval', explode(' ', trim(fgets(STDIN))));
    $x = min($a, $b, $c);
    $y = max($b - $x - 1, 0);
    echo ($x * 2 + $y) . PHP_EOL;
}

go 版本:

package main

import (
    "fmt"
)

func main() {
    var q int
    fmt.Scan(&q)
    for i := 0; i < q; i++ {
        var a, b, c int
        fmt.Scan(&a, &b, &c)
        x := a
        if b < x {
            x = b
        }
        if c < x {
            x = c
        }
        y := b - x - 1
        if y < 0 {
            y = 0
        }
        fmt.Println(2*x + y)
    }
}

python版本:

import sys

num=int(input())

temp_list=[]

for line in sys.stdin:
    temp_list.append(list(map(int,line.split())))


def youyou(ylist):
    con=[]
    for i in ylist:
        if min(i)==0:
            con.append(i[1]-1)
        else:
            t=min(i)
            con.append(t*2+max(((i[1]-t)-1),0))

    return con

ss=youyou(temp_list)
for i in ss:
    print(i)


 

import sys

def calculate_score(a: int, b: int, c: int) -> int:
    """计算最大得分"""
    you = min(a, b, c)
    return 2 * you + max(b - you - 1, 0)

def process_lines() -> None:
    """处理输入流"""
    try:
        # 读取第一行的测试用例数量
        n = int(sys.stdin.readline())
    except (ValueError, EOFError):
        return
    
    # 处理每个测试用例
    for _ in range(n):
        try:
            line = sys.stdin.readline()
            a, b, c = map(int, line.strip().split())
            print(calculate_score(a, b, c))
        except (ValueError, AttributeError):
            print(0)

if __name__ == "__main__":
    process_lines()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值