Tạo chuỗi N số 0 và M số 1 sao cho không có "00" và không có "111".
Điều kiện tồn tại
Không tạo được nếu: (M < N-1) || (M >= 2×(N+1))
Ví dụ
N=5, M=9 → 1 1 0 1 1 0 1 1 0 1 0 1 0 1
Thuật toán
- Nếu M = N-1: in xen kẽ "01"
- Nếu điều kiện vi phạm: báo không tạo được
- Ngược lại: ưu tiên in "110" cho đến khi M-N ≤ 1, rồi "10", cuối cùng các "1" thừa
Chương trình
#include <stdio.h>
int main() {
int n = 5, m = 9;
if (m == n - 1) {
while (m > 0 && n > 0) { printf("01"); m--; n--; }
if (n) printf("0");
if (m) printf("1");
}
else if (m < n - 1 || m >= 2 * (n + 1)) {
printf("Khong the tao day\n");
}
else {
while (m - n > 1 && n > 0) { printf("110 "); m -= 2; n--; }
while (n > 0) { printf("10 "); n--; m--; }
while (m > 0) { printf("1 "); m--; }
}
return 0;
}
Kết quả
1 1 0 1 1 0 1 1 0 1 0 1 0 1