2024年9月7日京东笔试第五批记录
1.忘了
思路:反正是贪心算法,找左边的最大,右边的最小,相减即为答案。
AC
2.牛牛障碍赛跑
思路:使用贪心算法,每次碰到障碍就判断,1.如果在障碍位置跳跃,跳跃b个位置后,(1)没有越过终点,则跳跃;(2)越过终点,就有问题,选择下一个方法。2.如果不在障碍位置跳跃,在上一个障碍位置和下一个障碍位置之间跳跃,(1)没有越过终点,则跳跃;(2)越过终点,就有问题,选择上一个方法。
代码:没有了,也没意义,应该用dp做的,但是没有思路。
0.25
3.牛牛减数
题目:输入n k sum,n个ai=i的队列,求减几次使得任意k个元素和不大于sum。
思路:求s=sum/k,m=sum%k,可以将sum拆分为最平均分布的k个值,m个(s+1),k-m个s,将队列的所有值按照这平均分布的k个值对齐,即保证最多有m个(s+1),其他的都要小于s。特殊情况,1.队列的最后k个元素和小于sum,直接返回0。2.k>n,那么表示队列取k个元素变为队列取n个元素,即k=n。
public class jingdong_3 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int t = in.nextInt();
while (t-- > 0) { // 注意 while 处理多个 case
long n = in.nextLong();
long k = in.nextLong();
long sum = in.nextLong();
long curSum = 0;
for(long i = n; i >=n-k+1; i--)
{
curSum += i;
}
if(curSum <= sum)
{
System.out.println(0);
continue;
}
if(k > n) k = n;
long s = sum / k;
long m = sum % k;
long res = 0;
for(long i = n; i >= 1; i--)
{
if(i > n-m)
{
if(i-(s+1) >= 0)
res += i-(s+1);
}else{
if(i-s >= 0)
res += i-s;
}
}
System.out.println(res);
}
}
}
吐槽:差一点就AC,就差个k>n的判断,如果k>n,则k=n。
0.33
结论:死脑筋了,最后一题应该多写点特殊情况,第二题后面知道动态规划但是不会。