前言:本人使用php编程语言编写
一: 小度帮同事买饮料,每个同事都会告诉小度要喝什么类型的饮料,店家正好做买一送一活动,每买一瓶任意类型饮料可以赠送同类型饮料一瓶,请问小度至少需要买几瓶饮料。
1.第一行输入两值:a,b。(a代表同事人数,且a>=0。b代表商店一共有多少种类型饮料,0<=b<=1000)(具体限制记不太清,不影响结果)
2.第二行输入a个值,代表每个同事想要喝的饮料类型。
例:(具体例子记不清,随便给个)
输入:
5 3
1 2 2 1 2
输出:
3
<?php
// 买饮料。
while (fscanf(STDIN, "%d%d", $a, $b) == 2) {
fscanf(STDIN, "%[^\n]s", $line);
//split line to array
$numbers = explode(" ", trim($line));
if(count($numbers) == $a && max($numbers) <= $b){
//将结果数组按值分类计数
$numbers = array_count_values($numbers);
$re = 0;
foreach ($numbers as $number){
//取进位整数
$re += ceil($number / 2.0);
}
printf("%d\n",$re);
}
}
二:小度所在的队伍执行任务,路上遇到三岔路口。军官有过吩咐,遇到三叉路口如果队伍可以分成两队,且两队人数差是b人,则分成两队向不同的路口继续走,若队伍无法按要求分成两队,则在此地扎营,问队伍一共扎了几处营地。
1.第一行输入a,b两个值,a代表队伍总人数,b代表分队的人数差。
例:
输入:
10 2
输出:
5
说明: 10
/ \
4 6
/ \ / \
1 3 2 4
/ \
1 3
<?php
// 三岔路口摆地摊。
while (fscanf(STDIN, "%d%d", $a, $b) == 2) {
$re = test($a,$b,0);
printf("%d\n",$re);
}
function test($a,$b,$c){
$re = 0;
//如果队伍人数少余(差值+1),直接扎营
if($a <= $b+1){
return $c+1;
}
//如果队伍人数减去差值可以被2整除(即可以分成两队)就分队
if(($a-$b)%2 == 0){
//递归扎营
$re += test(($a-$b)/2,$b,$c);
$re += test(($a-$b)/2+$b,$b,$c);
return $re;
}else{
return $c+1;
}
}
三:小度摆放火柴 1-9 九个数字,1 2 3 4 5 6 7 8 9 分别需要使用 2 5 5 4 5 6 3 7 6根火柴,给小度n根火柴,小度能摆出的最大数字是多少(火柴需全部使用完)
1.第一行输入a,b两个值,a代表给小度的火柴总数,b代表小度可以摆放的数字个数。
2.第二行输入b个值,代表小度可以摆放的数字。
例:
输入:
20 4
3 4 7 8
输出:
777773
没写出来,尬
结语:经过这次笔试测试,也是发现了自己很多不足。小题很多是关于数据结构的树、图那些,很可惜好久没复习忘得差不多了。大题最后一个没写出来也是有点遗憾。再接再厉吧。
如果你看到了并知道最后一题答案,也欢迎留言。
(题目均根据记忆写出来,如跟原题目有小差误也请谅解。任何问题可以留言。)