TRƯỜNG THPT CHUYÊN KỲ THI HSG CÁC TRƯỜNG THPT CHUYÊNThời gian 180 phút không kể thời gian phát đề Ngày thi: 14/7/2022 HƯỚNG DẪN THUẬT TOÁN Bài 1.. Xếp đội hình 7.0 điểm Subtask 1: Sinh t
Trang 1TRƯỜNG THPT CHUYÊN KỲ THI HSG CÁC TRƯỜNG THPT CHUYÊN
Thời gian 180 phút (không kể thời gian phát đề)
Ngày thi: 14/7/2022
HƯỚNG DẪN THUẬT TOÁN
Bài 1 Bộ chữ CVA (6.0 điểm)
Subtask 1,2: Duyệt với 3 vòng for để đếm ĐPT O(n3)
Subtask 3,4:
Với mỗi giá trị i mà s[i] = 'V', ta xem thử trước i có bao nhiêu chữ cái 'C' (lưu vào biến c), và bao nhiêu chữ cái 'A' sau i (lưu vào biến a) Khi đó, số bộ CVA mà chữ V tại vị trí s[i] là a*c, ta cộng dồn vào biến đếm
ĐPT O(n)
Bài 2 Xếp đội hình (7.0 điểm)
Subtask 1: Sinh từng cách xếp vị trí khác nhau và đối chiếu với vị trí ban đầu xem khác biệt bao nhiêu vị trí và chọn trường hợp ít nhất
Subtask 2: Chỉ có 2 cách sắp xếp:
Cách 1: 10101010….10
Cách 2: 01010101….01
So sánh mỗi cách với trạng thái ban đầu xem thử trường hợp nào có số vị trí trùng nhiều hơn (tức là đổi chỗ ít hơn)
Subtask 3: Gọi k là số chữ số 1 Bài toán tương đương với tìm xâu nhị phân độ dài n và
có k chữ số 1, không có 2 chữ số 1 gần nhau mà có số vị trí trùng với xâu s ban đầu nhiều nhất
Nếu 2k>n thì không có đáp án (viết -1)
Trong các xâu nhị phân độ dài i, có j kí tự 1, không có 2 kí tự 1 cạnh nhau, kí tự cuối cùng là t (t=0 hoặc 1), ta chọn xâu có nhiều vị trí trùng với xâu s[1 i] nhất Gọi F[i][j][t]
là số vị trí trùng nhiều nhất đó
Trang 2F[1][0][0] = 1 nếu s[1]='0';
F[1][0][1] = 1 nếu s[1]='1';
Nếu s[i]='0' thì:
F[i][j][0]=max(F[i-1][j][0], F[i-1][j][1])+1;
F[i][j][1]=F[i-1][j-1][0];
Nếu s[i]='1' thì:
F[i][j][0]=max(F[i-1][j][0], F[i-1][j][1]);
F[i][j][1]=F[i-1][j-1][0]+1;
Nếu F[n][k][1]>F[n][k][0] thì:
Lần ngược để tìm xâu kết quả x;
Nếu x[1]='0' thì T = F[n][k][1];
Nếu x[1] ≠ '0' thì T = F[n][k][0];
Nếu F[n][k][1] ≤ F[n][k][0] thì T = F[n][k][0];
Viết (n-T)/2
ĐPT O(n2)
Bài 3 Trò chơi (7.0 điểm)
Subtask 1: Dùng kĩ thuật DFS
Subtask 2: Dùng kĩ thuật BFS
Gọi (x,y) là trạng thái can 1 có x lít, can 2 có y lít
Từ trạng thái (x,y), với 1 lần đong nước, ta có thể chuyển sang 6 trạng thái (0,y), (a, y), (0, x+y) hoặc (x+y-b, b) hoặc
(x,0), (x, b), (x+y, 0) hoặc (a, x+y-a);
Mảng D[x][y] là số bước ít nhất để đạt đến trạng thái (x,y)
D[][]=∞ hết, riêng D[0][0]=0;
Đưa (0,0) vào queue Q;
Trong khi Q không rỗng:
Lấy trạng thái (x,y) ra khỏi Q;
t = D[x][y];
Nếu x=c hoặc y=c hoặc x+y=c thì viết t và kết thúc
Nếu D[0][y] = ∞ thì thêm (0,y) vào Q và D[0][y]=t+1;
Nếu D[a][y] = ∞ thì thêm (a,y) vào Q và D[a][y]=t+1;
Nếu x+y ≤ b thì:
oNếu D[0][x+y] = ∞ thì thêm (0,x+y) vào Q và D[0][x+y]=t+1;
Nếu x+y > b thì:
Trang 3oNếu D [x+y-b] [b] = ∞ thì thêm (x+y-b,b) vào Q và D[x+y-b][b]=t+1;
Nếu D[x][0] = ∞ thì thêm (x,0) vào Q và D[x][0]=t+1;
Nếu D[x][b] = ∞ thì thêm (x,b) vào Q và D[x][b]=t+1;
Nếu x+y ≤ a thì:
oNếu D [x+y][0] = ∞ thì thêm (x+y,0) vào Q và D[x+y][0]=t+1;
Nếu x+y > a thì:
oNếu D[a][x+y-a] = ∞ thì thêm (a,x+y-a) vào Q và D[a][x+y-a] =t+1; Cuối cùng, viết -1
Giáo viên HD: Trần Hữu Nam
SĐT: 0969 156 825