4.18 拼多多笔试一、四题解
第一题
思路非常暴力,就是枚举范围内的每个点,以该点为中心(对角线交点)扩散,若在扩散后仍在范围内则计数
是我迄今为止做过的最暴力的一道题...直接套四个循环...能A我是没想到的....当然肯定有更好的解法,希望有大佬可以分享
package main
import (
"fmt"
)
func main() {
var x, y int
fmt.Scan(&x, &y)
fmt.Println(solution(x, y))
}
func solution(x, y int) int {
if x < 2 || y < 2 {
return 0
}
var ans int
for i := 1; i <= x; i++ {
for j := 1; j <= y; j++ {
for k := 1; i+k <= x && i-k >= 0; k++ { // 横向发展
for n := 1; n+j <= y && j-n >= 0; n++ { // 纵向发展
ans++
}
}
}
}
return ans
}
第四题
我的思路是模拟的做法,首先确定最优的拿法是:分剩余数是奇偶两种,奇就只能拿一个,偶的话若在拿后剩奇数个,则直接拿一半,若剩偶数个,则拿一个,因为对方拿到少自己才能拿的多,需要注意的是当剩余数比较小时,如剩余数的一半小于等于2,要特殊处理,之后根据最优拿法模拟就好了
package main
import "fmt"
func main() {
var groups, temp int
fmt.Scan(&groups)
for groups != 0 {
fmt.Scan(&temp)
fmt.Println(battle(temp))
groups--
}
}
func maxCoins(n int) int {
round := 0
if n == 1 {
round += 1
return round
}
if n%2 == 0 {
if (n/2)%2 != 0 || n/2 <= 2 {
round += n / 2
} else {
round++
}
} else {
round += 1
}
return round
}
func battle(n int) (int, int) {
duoduo, pipi := 0, 0
duoRound, piRound := 0, 0
for n != 0 {
duoRound = maxCoins(n)
duoduo += duoRound
n -= duoRound
if n == 0 {
break
}
piRound = maxCoins(n)
pipi += piRound
n -= piRound
}
return duoduo, pipi
}
以上是一根菜狗的思路分享...对于二、三题都只骗了点分....希望好心的大佬分享分享思路
#我的实习求职记录##拼多多##笔试##拼多多笔试##24实习#