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:
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 N và M 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, M và P
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
include <stdio.h>
int A[2005];
int main() { int n, m, p, x; scanf("%d %d %d", &n, &m, &p);
}
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.
Ô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ờ.”
FULL AC
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; }
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; }
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]); } } }
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)
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
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
p==n
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
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 ạ.
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]; }
}
ơ kè chơi bửn
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.