有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);
}
}