Gán hoặc giảm

Đề bài

Mô tả

Cho một dãy số nguyên a1,a2,,an và một số nguyên k.

Trong một bước, bạn được chọn một trong hai thao tác sau:

  • Chọn một chỉ số i và giảm ai đi 1 (tức là gán ai=ai1);
  • Chọn hai chỉ số ij rồi gán ai bằng aj (tức là gán ai=aj).

Hãy tìm số bước ít nhất cần thực hiện để tổng của dãy thoả mãn i=1naik.

Các phần tử của dãy được phép mang giá trị âm trong quá trình biến đổi.

Dữ liệu vào

  • Dòng đầu chứa một số nguyên t là số bộ dữ liệu.
  • Mỗi bộ dữ liệu gồm hai dòng:
    • Dòng thứ nhất chứa hai số nguyên nk.
    • Dòng thứ hai chứa n số nguyên a1,a2,,an.

Dữ liệu ra

Với mỗi bộ dữ liệu, in ra trên một dòng số bước ít nhất cần thực hiện.

Ràng buộc

  • 1t104
  • 1n2·105
  • 1k1015
  • 1ai109
  • Tổng của n trên tất cả các bộ dữ liệu không vượt quá 2·105.

Ví dụ

Input Output Giải thích
4
1 10
20
2 69
6 9
7 8
1 2 1 3 1 2 1
10 1
1 2 3 1 2 6 1 6 8 10
10
0
2
7
Bộ 1: giảm a1 đúng 10 lần để tổng còn 10.
Bộ 2: tổng bằng 1569 nên không cần làm gì.
Bộ 3: gán a4=a3=1 rồi giảm a4 đi 1, dãy thành [1,2,1,0,1,2,1] có tổng 8, hết 2 bước.
Bộ 4: giảm a7 ba lần để a7=2, rồi gán a6,a8,a9,a10 bằng 2, tổng còn 1, hết 3+4=7 bước.
3
5 5
1 1 1 1 1
4 3
5 5 5 5
3 100
1 2 3
0
8
0
Bộ 1: tổng bằng 55.
Bộ 2: giảm một phần tử từ 5 xuống 0 mất 5 bước, rồi gán ba phần tử còn lại bằng nó mất 3 bước; tổng thành 03, hết 8 bước.
Bộ 3: tổng bằng 6100.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.400 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.2 gforth 0.7.3 gfortran 12.2.0 go 1.27.0 groovyc 5.1.1 javac 25.0.4 node 26.8.1 julia 1.12.7 kotlinc 2.4.10 lean 4.33.1 sbcl 2.2.9 lua 5.4.9 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.10 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.14.7 racket 8.7 ruby 4.0.6 rustc 1.98.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.3.3 tclsh 8.6 bun 1.4.0 deno 2.9.6 v 0.5.2 zig 0.16.0