恐龍下蛋
給出一個降序數組,每一輪數組中的元素
a[i]
都會增加
i
,傳回幾輪之後數組中會出現相同的元素。
輸入描述:第一行為一個數字,表示數組的長度,第二行為數組中的元素。
輸出描述:幾輪之後會出現相同的元素,如果不用變化則輸出0。-
輸入:
3
8 4 2
輸出:
2
分析,這道題看着比較複雜,想到了還是比較簡單的。我一開始直接暴力模拟,隻通過了50%,估計後面的逾時了。
對于數組中的元素a[i]和a[i+1]來說,每次後面一個元素比前面那個元素多增加1,是以經過a[i]-a[i+1]輪之後,兩個元素持平,由此可以得出代碼:
public static void main(String[] arg){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] nums = new int[n];
for(int i=0;i<nums.length;i++){
nums[i] = scanner.nextInt();
}
//因為元素是降序排列的,是以可以斷言最大內插補點為nums[0]
int min = nums[0];
for(int i=0;i<n-1;i++){
min = Math.min(nums[i]-nums[i+1],min);
}
System.out.println(min);
}
驿站
n 個客棧依次排列,給出 n - 1 條路的權重。從任意一處出發,每走過一條路,該路的權重減 1,但得到1 點利益。不能走權重為 0 的路。求最大利益。
輸入:
5
2 1 4 3
輸出
9
說明
考慮滿足條件的路徑為2-1-2-3-4-5-4-3-4-5
清華大佬的題解:https://www.nowcoder.com/discuss/462000?type=post&order=time&pos=&page=1&channel=1012&source_id=search_post
public static void a02(int n,int[] nums){
//從第k個客棧出發,在客棧左邊獲得的利益。
int[] f_l = new int[n];
//從第k個客棧出發,在客棧右邊獲得的利益。
int[] f_r = new int[n];
//從第k個客棧出發,并且在k個客棧結束,在客棧左邊獲得的利益。
int[] g_l = new int[n];
//從第k個客棧出發,并在第k個客棧結束,在R_k中獲得的最大利益
int[] g_r = new int[n];
f_l[0] = 0;
g_l[0] = 0;
for(int i=1;i<n;i++){
if(nums[i-1]%2 == 1){
f_l[i] = f_l[i-1]+nums[i-1];
//因為最後要回到出發點,是以隻能周遊偶數次
g_l[i] = g_l[i-1]+nums[i-1]-1;
}else{
g_l[i] = g_l[i-1]+nums[i-1];
f_l[i] = Math.max(f_l[i-1]+nums[i-1]-1, g_l[i]);
}
}
for(int i=n-2;i>=0;i--){
if(nums[i]%2 == 1){
f_r[i] = f_r[i+1]+nums[i];
//因為最後要回到出發點,是以隻能周遊偶數次
g_r[i] = g_r[i+1]+nums[i]-1;
}else{
g_r[i] = g_r[i+1]+nums[i];
f_r[i] = Math.max(f_r[i+1]+nums[i]-1, g_r[i]);
}
}
int max = Integer.MIN_VALUE;
for(int i=0;i<n;i++){
max = Math.max(Math.max(f_l[i]+g_r[i],f_r[i]+g_l[i]),max);
}
System.out.println(max);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] nums = new int[n-1];
for(int i=0;i<n-1;i++)
nums[i] = scanner.nextInt();
a02(n,nums);
}