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实习#
全部评论
第一题就是分情况,x为偶数(8)那么它的可选是0-2-4-6-8的两端组合,可能数为4+3+2+1=10,同时考虑奇数1-3-5-7,可能数为3+2+1=6,然后同理乘上y的可能数就是最后的结果了
1 回复 分享
发布于 2023-04-19 17:01 湖南
第二题,可以理解为多个梯形面积之和,对于交换的点,影响的是该点的左右两个梯形,那么可以排序后两层循环,比较两个点的交换后的面积变化,具体为yi*(xi+1-xi-1)+yj(xj+1-xj-1)与yj*(xi+1-xi-1)+yi(xj+1-xj-1)的差值
1 回复 分享
发布于 2023-04-19 17:10 湖南
楼主什么岗位
点赞 回复 分享
发布于 2023-04-19 18:00 陕西
笔试时间是多久
点赞 回复 分享
发布于 2023-04-19 18:06 辽宁

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务