第一题
给 n 个恐龙蛋及恐龙蛋的大小,按从大到小排列,第 i 个恐龙蛋每天增大 i,问最少几天会出现两个同样大小的恐龙蛋。
解题思路
数组问题。题目等价于给定一个从大到小排列好的数组,求相邻两个数字之间的最小差。
Java代码
//n是恐龙蛋的数量
int[] nums=int[n];
int min=nums[0];
for(int i=1;i<n;i++){
min=Math.min(nums[i-1]-nums[i],min);
}
//返回答案
return min;
第二题
n 个客栈依次排列,给出 n - 1 条路的权重。从任意一处出发,每走过一条路,该路的权重减 1,但得到 1 点利益。不能走权重为 0 的路。求最大利益。
解题思路
数组问题。找规律。中间路径如果是奇数都可以通过“反复横跳”全部走完,如果是偶数则只能去,不能回。对于首位的偶数,则可以选择从第二点出发,末位的偶数也可以去了再返回。如果首位是偶数,并且之后也是偶数,则可以从第一个不是偶数的点返回至首位再回去,所以需要进行处理。
Java代码
//n是客栈的数量
int[] nums=int[n];
int ans=0;
//对数组进行预处理,把首尾的相连偶数都算进答案
//处理首位相连偶数
int j=0;
while(j+1<n && nums[j]%2==0 && nums[j+1]%2==0){
nums[j]--;
ans++;
j++;
}
//处理末位相连偶数
j=n-1;
while(j>1 && nums[j]%2==0 && nums[j-1]%2==0){
nums[j]--;
ans++;
j--;
}
for(int i=0;i<n;i++){
if(nums[i]%2==1){
//奇数直接加
ans+=nums[i];
}else{
//中间偶数要-1
ans+=nums[i]-1;
}
}