Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ หาอาร์เรย์หลังแทรกค่าใหม่ที่ผลต่างคู่ใดคู่หนึ่งอยู่ในอาร์เรย์

สมมติว่าเรามีอาร์เรย์ 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,