小明在数学课上与同学无缘无故起了攀比心!老师们在教大家计数,每个同学有一排n
个木棍,每个木棍上初始插着一些算珠,木棍从左到右依次编号为 1,2,3,...,n
,其上的算珠数量也分别为 a1, a2, ..., an
。小明认为,将这些算珠数是可以看作一个非负整数数组[a1, a2, a3, ..., an]
, 其字典序越小就越厉害。
小明可以将他的一些管珠那一下位置,即从一根木棍上取一颗算珠下来然后放到另一根木棍上(一次操作只能移动一颗算珠) 。小明想比其他人都厉害,但是他也不想太过分,他想知道如果他能进行最多 k
次移动操作,能得到的最小字典序的数组是怎样的。
注意,你不能从算珠数为0
的木棍上再取走一个算珠使得数显变成-1
。每个木棍上可以插无限多个算珠。
数组x
的字典序小于数组y
当且仅当存在一个下标i
,使得xi
1 <= j < i
存在xj = yj
。例如:
[1,2,3] < [2,2,3]``,`` [1,2,3] < [1,2,4]
第一行2
个整数n
和k
,表示木棍数量和小明能最多进行的移动操作次数
第二行n
个整数a1, a2, ..., an
,表示初始时木棍上的算珠数量。
1
输出一行n个整数表示移动最多k
次后最小字典序数组。
4 2
1 2 2 4
0 1 2 6
直接把k
次都加到最后一个元素即可,将前面的元素尽可能地减直到k
次用完。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int []a = new int[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
}
int tk = k;
for (int i = 1; i <= n - 1; i++) {
if (a[i] <= k) {
k -= a[i];
a[i] = 0;
}else {
a[i] -= k;
break;
}
}
a[n] += tk;
for (int i = 1; i <= n; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
}
#include
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector a(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int tk = k;
for (int i = 1; i <= n - 1; i++) {
if (a[i] <= k) {
k -= a[i];
a[i] = 0;
} else {
a[i] -= k;
break;
}
}
a[n] += tk;
for (int i = 1; i <= n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
华为OD算法冲刺训练
华为OD算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
30+天陪伴式学习,20+直播课时,300+动画图解视频,200+LeetCode经典题,100+华为OD真题,还有简历修改与模拟面试将为你解锁
可查看链接 OD算法冲刺训练课程表 & OD真题汇总(持续更新)
绿色聊天软件戳 od1336了解更多