头条2019.3.16笔试第三题,leedcode 135分糖果的变种

本文介绍了一种解决竞赛中奖品分配问题的算法,确保每位参赛者的奖品数量符合其分数及相对位置的要求,通过双向比较优化奖品分配方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有N个参赛者围成一圈 (第0个人和第n - 1个人相邻),每个人有自己的参赛分数。现在给每人发奖品,要求:

(1)每人奖品个数起码为1;(2)如果一人的分数高于左右邻居,则其得到的奖品数目也要大于左右邻居。

 

输入第一个数M是一轮测试中会跑的例子总数;

第二个数N是共有多少个参赛者;

接下来N个数是这些参赛者的分数(按照参赛者围成一圈的顺序排列,第0个挨着第N - 1个)。要求输出最少的奖品数目之和

 

 

 

解题思路:

  • 设置两个临时数组填充为1,
  • 从左往右比较相邻数组,越界用数组长度取余,更新临时数组1
  • 从右往左比较,更新临时数组2
  • 取临时数组相同位置较大数进行累加
  • 累加完毕后的数字即为题目要求输出

出现问题:

  • 同时使用Scanner中的next和nextline函数需要在next()后面添加一行in.nextline,好过滤掉next省略掉的换行符号
  • 定义数组注意越界问题


 

import java.util.Scanner;

public class divide {

    public divide(int[][] arr) {
        // TODO Auto-generated constructor stub
        int len=arr.length;
        int num=0;
        for(int i=0;i<len;i++) {
            int[] temp1=new int[arr[i].length];
            int[] temp2=new int[arr[i].length];
            for(int j=0;j<arr[i].length;j++) {
                temp1[j]=1;
                temp2[j]=1;
            }
            for(int l=0;l<arr[i].length;l++) {
                if(arr[i][l]>arr[i][(l+1)%arr[i].length]) {
                    temp1[l]=temp1[(l+1)%arr[i].length]+1;
                }
            }
            for(int r=arr[i].length-1;r>0;r--) {
                if(r==0) {
                    if(arr[i][r]>arr[i][arr[i].length-1])
                        temp2[r]=arr[i][arr[i].length-1]+1;
                }
                else {
                    if(arr[i][r]>arr[i][r-1])
                        temp2[r]=arr[i][r-1]+1;
                }
                    
            }
            for(int n=0;n<arr[i].length;n++) {
                num+=Math.max(temp1[n], temp2[n]);
            }
            System.out.print(num);
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in=new Scanner(System.in);
        int ybs=in.nextInt();//样本数
        int[][] lunshu=new int[ybs][];
        for(int i=0;i<ybs;i++) {
            int num_man=in.nextInt();
            in.nextLine();//同时使用Scanner中的next和nextline函数需要在next()后面添加一行in.nextline,好过滤掉next省略掉的              lunshu[i]=new int[num_man];        //转行符号
            String str=in.nextLine();
            String[] s=str.split(" ");
            int index=0;
            for(String v:s) {
                lunshu[i][index++]=Integer.parseInt(v);
            }
            //System.out.println(Arrays.toString(lunshu[i]));
        }
        in.close();
        new divide(lunshu);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值