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实习#