[Mảng 1 Chiều Cơ Bản]. Bài 31. Chèn mảng

Xem dạng PDF

Gửi bài giải

Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Tác giả:
Nguồn bài:
28Tech
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Java, Kotlin, Pascal, PyPy, Python, Scratch

Cho mảng A[], B[] gồm NM phần tử, hãy chèn mảng B vào chỉ số P của mảng A và in ra mảng A[] sau khi chèn.


Đầu vào

Dòng 1 gồm N, MP

Dòng 2 gồm các phần trong mảng A[]

Dòng 3 gồm các phần tử trong mảng B[]


Giới hạn

1<=N<=M<=1000

0<=P<=N

0<=A[i], B[i]<=1000


Đầu ra

In ra mảng A[] sau khi chèn


Ví dụ :

Input 01
3 3 0
1 2 3
4 5 6
Output 01
4 5 6 1 2 3
Input 02
3 3 1
1 2 3
4 5 6
Output 02
1 4 5 6 2 3

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    bengokyeuanh99  đã bình luận lúc 6, Tháng 7, 2025, 6:39

    include <stdio.h>

    int A[2005];

    int main() { int n, m, p, x; scanf("%d %d %d", &n, &m, &p);

    for (int i = 0; i < n; ++i)
        scanf("%d", &A[i]);
    
    for (int i = n - 1; i >= p; --i)
        A[i + m] = A[i];
    
    for (int i = 0; i < m; ++i) {
        scanf("%d", &x);
        A[p + i] = x;
    }
    
    for (int i = 0; i < n + m; ++i)
        printf("%d ", A[i]);
    
    return 0;
    

    }


  • 0
    hngoc  đã bình luận lúc 4, Tháng 7, 2025, 15:46
    n,m,k=map(int,input().split())
    a=input().split()
    b=input().split()
    c=a[0:k]+b+a[k:]
    for x in c:print(x,end=' ')
    

  • 0
    nmtuong_cpp  đã bình luận lúc 2, Tháng 7, 2025, 17:41

    Bài này mình làm theo kiểu cho mảng A[m + n], dịch ví trí sang phải từ vị trí p, chèn mảng B vào mảng A từ vị trí p, thì không full AC. Hỏi Grok nó cũng không nghĩ ra sai chỗ nào mới đau -.-.

    Làm theo kiểu in ra mảng A tới vị trí p, sau đó in ra mảng B từ vị trí p, rồi lại in tiếp phần còn lại của mảng A thì lại full AC.


    • 0
      bengokyeuanh99  đã bình luận lúc 6, Tháng 7, 2025, 6:28

      Ông sai không phải vì tư duy sai hoàn toàn, mà sai ở chỗ… đủ hiểu nhưng chưa đủ sâu. Cụ thể: Sai chỗ chết người: for (int i = index; i < n; i++) { arrA[i + m] = arrA[i]; }

      Câu lệnh trên tưởng đúng – nhưng lỗi logic nghiêm trọng khi chèn mảng giữa: Khi dịch từ trái sang phải (từ index -> n) thì giá trị phía sau bị overwrite trước khi được đẩy, gây data corruption ngầm, nhất là nếu index > 0.

      Đây là bài học kinh điển trong thao tác dịch mảng: "Khi chèn mà phải dịch chỗ trống, thì dịch ngược từ cuối mảng về đầu để không làm rơi dữ liệu."

      Fix chuẩn là: for (int i = n - 1; i >= index; i--) { arrA[i + m] = arrA[i]; }

      Tư duy đúng bài: Đề yêu cầu xử lý mảng kiểu mutation trực tiếp (in-place), không phải chỉ in ra mảng tổ hợp. Cách “chia 3 đoạn rồi in” là 1 trick chạy được, nhưng không đúng về xử lý mảng thật, không scale nếu sau cần thao tác tiếp (sort, filter, remove...).

      Nếu tư duy theo hướng truy xuất sau này, thì mảng gốc phải giữ được trạng thái đúng – chứ không chỉ “cho ra output đúng”.

      Thêm 1 bonus trap tiềm ẩn mà ông nên học luôn: Nếu arrA[] không đủ n + m phần tử mà không pre-alloc đúng size, khi dịch sẽ đè dữ liệu khác, gây lỗi runtime random.

      Vậy nên: int arrA[2005]; // Không nên arrA[n + m] nếu n, m nhập vào

      Vì C++ không cho dynamic array theo biến không constant.

      Tổng kết cho anh em sau này khỏi toang: Dịch mảng -> luôn dịch từ cuối về đầu Muốn mutate mảng thật thì phải allocate đủ size In ra thì chia 3 đoạn cũng đúng, nhưng đó là short path, không phải true logic mutation Grok không debug hộ, nó chỉ nhìn syntax và flow - tư duy sai, nó im re

      “Không phải cứ ra được output là đúng – phải hiểu bản chất dữ liệu đang xử lý cái gì. Output đúng mà logic sai = quả bom hẹn giờ.”


  • -1
    VDev  đã bình luận lúc 23, Tháng 2, 2025, 8:24

    FULL AC

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll a[10000011], b[10000011];
    int main(){
        ll n, m, p;
        cin >> n >> m >> p;
        for(ll i = 0; i < n; i++){
            cin >> a[i];
        }
        for(ll i = 0; i < m; i++){
            cin >> b[i];
        }
        ll h = 0;
        for(ll i = 0; i <= n; i++){
                if(i != p){
                    cout << a[h] << " ";
                    h++;
                }else{
                    for(ll j = 0; j < m; j++){
                        cout << b[j] << " ";
                    }
                }
        }
        return 0;
    }
    

  • 0
    hoangvutitt  đã bình luận lúc 7, Tháng 2, 2025, 9:36

    include <bits/stdc++.h>

    define speed ios::syncwithstdio(false); cin.tie(nullptr); cout.tie(nullptr);

    define ll long long

    define db double

    using namespace std; int dem[10000001]; int n, m, p; void chen(int a[], int b[]){ int c = n; if(p == 0){ while(c){ a[c + m - 1] = a[c - 1]; c--; } for(int i = 0; i < m; i++) a[i] = b[i]; } else if(p == n - 1) for(int i = n; i < n + m; i++) a[i] = b[i - n]; else{ while(c != p){ a[c + m - 1] = a[c - 1]; c--; } for(int i = p; i < p + m; i++) a[i] = b[i - p]; } } int main() { speed cin >> n >> m >> p; int a[2500], b[2500]; for(int i = 0; i < n; i++) cin >> a[i]; for(int i = 0; i < m; i++) cin >> b[i]; chen(a, b); for(int i = 0; i < n + m; i++) cout << a[i] << ' '; return 0; }


  • 0
    ho_sy_son_072  đã bình luận lúc 6, Tháng 2, 2025, 3:28

    include <iostream>

    include <iomanip>

    include <cmath>

    using namespace std;

    int main(){ int n,m,p; cin >> n >> m >> p; int a[n],b[m]; for(int i=0;i<n;i++){ cin >> a[i]; } for(int i=0;i<m;i++){ cin >> b[i]; } for(int i=0;i<p;i++){ cout << a[i] << " "; } for(int i=0;i<m;i++){ cout << b[i] << " "; } for(int i=p;i<n;i++){ cout << a[i] << " "; } return 0; }


  • -2
    Kaybe  đã bình luận lúc 7, Tháng 1, 2025, 6:34

    include <stdio.h>

    include <math.h>

    int main(){ int n, m, p; scanf("%d%d%d", &n, &m, &p); int a[1001], b[1001]; for(int i = 0; i < n; i++){ scanf("%d", &a[i]); } for(int i = 0; i < m; i++){ scanf("%d", &b[i]); } for(int i = 0; i < n; i++){ if(i == p){ for(int j = 0; j < m; j++){ printf("%d ", b[j]); }
    } printf("%d ", a[i]);
    } if(p == n){ for(int j = 0; j < m; j++){ printf("%d ", b[j]); } } }


  • -2
    thinhphamminh274  đã bình luận lúc 10, Tháng 11, 2024, 14:43

    include <bits/stdc++.h>

    define N 1005

    define M 1005

    using namespace std; int a[N]; int b[M]; int main() { int n, m, p; cin >> n >> m >> p; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < m; i++) { cin >> b[i]; } for (int i = 0; i < n; i++) { if (i == p) { for (int j = 0; j < m; j++) { cout << b[j] << " "; } } cout << a[i] << " "; } if(p==n) { for (int i=0;i<n;i++) cout << b[i] << " "; } cout << endl; return 0; } cho newbie tham khảo(code dễ hiểu)


  • -2
    huu_binh_cpp  đã bình luận lúc 19, Tháng 7, 2024, 17:42

    lưu ý: khi chèn vào thì chỉ số của mảng a tăng m giá trị, mảng b ở vị trí của chỉ số p c


  • -5
    NTH11112222  đã bình luận lúc 10, Tháng 6, 2024, 16:03

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -8
    TNgocNewbie18107  đã bình luận lúc 30, Tháng 5, 2024, 0:46

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -6
    Nghaiz  đã bình luận lúc 7, Tháng 5, 2024, 17:02

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -4
    van_hao_638  đã bình luận lúc 2, Tháng 5, 2024, 16:28

    include <stdio.h>

    include <math.h>

    int main(){ int n,m,p; scanf("%d%d%d",&n,&m,&p); int a[n],b[m]; for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<m;i++) scanf("%d",&b[i]); for(int i=0;i<n;i++){ if(p==i){ for(int j=0;j<m;j++){ printf("%d ",b[j]); } } printf("%d ",a[i]); } }

    Anh Chị ơi, có thể chỉ giúp em sai chỗ nào được không ạ? em không biết em sai ở đâu mà vẫn còn sai 1 testcase ạ.


    • 1
      minhquan2905  đã bình luận lúc 16, Tháng 5, 2024, 15:59 chỉnh sửa

      include<stdio.h>

      int main(){ int n,m,p; scanf("%d %d %d", &n, &m, &p); int a[n+m]; int b[m]; for(int i=0;i<n;i++) { scanf("%d", &a[i]); } for(int i=0;i<n;i++) { scanf("%d", &b[i]); } for(int i=n-1;i>=p;i--) { a[i+m]=a[i]; }

      for(int i=p;i<=m+p-1;i++)
      {
          a[i]=b[i-p];
      }
      for(int i=0;i&lt;m+n;i++)
      {
          printf("%d ", a[i]);
      }
      return 0;
      

      }


    • -1
      minhquan2905  đã bình luận lúc 16, Tháng 5, 2024, 14:26

      ơ kè chơi bửn


  • -29
    minhtran1482003  đã bình luận lúc 23, Tháng 4, 2024, 13:51

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.