สมมติว่าเรามีอาร์เรย์ A ที่มี n องค์ประกอบที่แตกต่างกัน อาร์เรย์ B เรียกว่า "น่ารัก" (nice) ถ้าสำหรับองค์ประกอบที่แตกต่างกันใดๆ B[i] และ B[j] ค่า |B[i] - B[j]| ปรากฏใน B อย่างน้อย 1 ครั้ง และองค์ประกอบทั้งหมดใน B จะแตกต่างกัน เราต้องตรวจสอบว่าสามารถเพิ่มจำนวนเต็มบางส่วนใน A เพื่อทำให้มันเป็น nice ขนาดสูงสุด 300 ได้หรือไม่ หากเป็นไปได้ ให้คืนค่าอาร์เรย์ใหม่ มิฉะนั้นคืนค่า -1
เช่น ถ้าค่าที่ป้อนเข้าเป็น A = [4, 8, 12, 6] ผลลัพธ์จะได้ [8, 12, 6, 2, 4, 10] เพราะ |4-2| = |6-4| = |8-6| = |10-8| = |12-10| = 2 อยู่ในอาร์เรย์ |6-2| = |8-4| = |10-6| = |12-8| = 4 อยู่ในอาร์เรย์ |8-2| = |10-4| = |12-6| = 6 อยู่ในอาร์เรย์ |10-2| = |12-4| = 8 อยู่ในอาร์เรย์ และ |12-2| = 10 อยู่ในอาร์เรย์ ดังนั้นอาร์เรย์เป็น nice (คำตอบอื่นก็ได้)
ขั้นตอนการแก้ปัญหา
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนดังนี้:
n := ขนาดของ A t := 0 b := 0 สำหรับ i := 0 เมื่อ i < n เพิ่ม i ทีละ 1 ทำ: a := A[i] ถ้า a < 0 แล้ว: t := 1 b := max(a, b) ถ้า t ไม่เป็นศูนย์ แล้ว: พิมพ์ -1 มิฉะนั้น สำหรับ i := 0 เมื่อ i <= b เพิ่ม i ทีละ 1 ทำ: พิมพ์ i
ตัวอย่างโค้ด
ดูการนำไปใช้จริงด้านล่างเพื่อความเข้าใจที่ดียิ่งขึ้น:
#include <bits/stdc++.h> using namespace std; void solve(vector<int> A) { int n = A.size(); int t = 0; int b = 0; for (int i = 0; i < n; i++) { int a = A[i]; if (a < 0) t = 1; b = max(a, b); } if (t) cout << "-1"; else { for (int i = 0; i <= b; i++) cout << i << ", "; } } int main() { vector<int> A = { 4, 8, 12, 6 }; solve(A); }
ข้อมูลนำเข้า
{ 4, 8, 12, 6 }
ข้อมูลส่งออก
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,