一、题目
题目链接:游游的you__牛客网
题目描述:
游游现在有a个'y',b个'o',c个'u',他想用这些字母拼成一个字符串。
三个相邻的字母是"you"可以获得2分,两个相邻的字母是"oo",可以获得1分。
问最多可以获得多少分?
输入描述:
第一行一个整数qqq,代表询问次数。
接下来qqq行,每行三个正整数a,b,ca,b,ca,b,c,用空格隔开。
1≤q≤
1≤a,b,c≤
输出描述:
输出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()