寿司店周年庆,正在举办优惠活动回馈新老客户寿司转盘上总共有n盘寿司,prices[i] 是第 i 盘寿司的价格,如果客户选择了第 i盘寿司,寿司店免费赠送客户距离第 i 盘寿司最近的下一盘寿司 j,前提是prices[j] < prices[i],如果没有满足条件的 j,则不赠送寿司。
每个价格的寿司都可无限供应。
输入描述:输入的每一个数字代表每盘寿司的价格,每盘寿司的价格之间使用空格分隔;寿司的盘数 n范围为: 1 <= n <= 500
输出描述:输出享受优惠后的一组数据,每个值表示客户选择第 i 盘寿司时实际得到的寿司的总价格。使用空格进行分隔。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String[] pricestring = sc.nextLine().trim().split("[ ]");
int[] prices = new int[pricestring.length];
for(int i = 0;i < prices.length;i++){
prices[i] = Integer.parseInt(pricestring[i]);
}
//单调栈
Deque<Integer> price = new ArrayDeque<>();
//记录结果数组
int[] res = Arrays.copyOf(prices,prices.length);
for(int i = 0;i < res.length;i++){
//送小的,所以右边比左边大或等入栈
while(!price.isEmpty()&&prices[price.peek()] > prices[i]){
int index = price.pop();
res[index] = prices[index] + prices[i];
}
price.push(i);
}
//后半部分没找到的,需要从前面寻找
while(!price.isEmpty()){
int index = price.pop();
for(int i = 0;i < index;i++){
if(prices[index] > prices[i]){
res[index] = prices[index] + prices[i];
break;
}
}
}
for(int i = 0;i < res.length;i++){
System.out.print(res[i] + " ");
}
}
}