Tải bản đầy đủ (.docx) (7 trang)

NỘI DUNG bồi DƯỠNG HSG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (92.27 KB, 7 trang )

Buổi 1:
1. BÀI TỐN TÌM KIẾM TUẦN TỰ:
Dạng 1: tìm tất cả ( dùng for và while)
- Dùng biến trạng thái.
- Vd1: bài tốn tìm kiếm cơ bản.
- Vd2: Bài tốn đếm số ước của N ngồi 1 và N. ( chú ý thu gọn cận)
- Vd3: Kiểm tra N là số nguyên tố.
- Vd4: Đếm các số nguyên tố trong 1 mảng.
Dạng 2: Tìm 1 phần tử thỏa mãn: (dùng for và while)
- Vd1: tìm và đưa ra số âm đầu tiên/ số nguyên tố đầu tiên/….
Buổi 2: Duyệt dãy con trong mảng:
Dạng 1:
- độ dài k = cuối -đầu +1;
vd1: in ra chỉ số các đoạn con =0; liệt kê theo điểm đầu, độ dài giảm dần;
vd2: in ra chỉ số các đoạn con =0; liệt kê theo điểm đầu, cuối, theo thứ tự
xuất hiện.
vd3: in ra độ dài đoạn tăng/ giảm/ hình sin/ đơn điệu /…
vd4: in ra cs đầu, cuối của đoạn con =0 có độ dài k.
c1: i=1-n; nếu a[i]=0 thì đếm, nếu ai<>0 thì so sánh đếm =k thì in
c2: duyệt đầu , cuối: I =1 ,j=i+k-1; kiểm tra đoạn (I,j) thỏa mãn  in;

Dạng 2: Đoạn con có độ dài dài nhất/ ngắn nhất:
vd1: in ra độ dài các đoạn con =0 dài nhất.

Buổi 3: Hàm, thủ tục.
- hàm giải pt bậc 2 ( cho 2 pt)
- hàm kiểm tra số nguyên tố;


- hàm kiểm tra số hoàn hảo;
- hàm kiểm tra dãy đối xứng ;


Viết lại các chương trình sau có sử dụng hàm:
- đếm số nguyên tố/ số hoàn hảo trong mảng;
- đếm số dãy đối xứng trong mảng;
mở rộng:
- đưa ra đoạn con là các số nguyên tố/ hoàn hảo dài nhất.
- đưa ra đoạn con đối xứng dài nhất;
Buổi 4: TÌM KIẾM NHỊ PHÂN:
- ÁP DỤNG CHO MẢNG ĐÃ SẮP XẾP.
- TÌM GIÁ TRỊ K TRONG MẢNG .NẾU CĨ ĐƯA RA CHỈ SỐ CỦA
A[I]=K; NẾU KHƠNG , IN RA -1;
using namespace std;
int a[100],i,j,n,k;
int tknp(int l,int r,int x)
{ l=1; r=n; int mid;
while (l<=r)
{ mid=(l+r)/2;
if (a[mid]==x) return mid; else
{if (a[mid]>x)
r=mid-1;
else l=mid+1;
}
}
return -1;
}


int main()
{cin>>n>>k;
for(i=1;i<=n;i++) cin>>a[i];
cout<

return 0;
}
2. Cho một dãy số khoảng 1000000 kí tự số tồn 0 và 1. Biết rằng các số 0
đứng
trước các chữ số 1: 000....0011...11. Hãy cho biết vị trí của số 0 cuối cùng
trong
dãy.
3. int main()
4. {cin>>n;
5. for(i=1;i<=n;i++) cin>>a[i];
6. l=1; r=n;a[n+1]=1;
7. while (l<=r)
8.
{ mid=(l+r)/2;
9.
if (a[mid]==0)
10.
l=mid+1;
11.
else
12.
r=mid-1;
13.
}
14.
cout<15. return 0;
16.}
Bài 3: Cho mảng số nguyên A(n).
a. Tìm và đưa ra 1 cặp chỉ số của ai, aj thỏa mãn aj=2*a[i]; (i<=j)

Vd: input: 1 2 3 5 6 7 8 10 10;
Out: 1,2; 3,5; 4,8;
b. Đếm tất cả các cặp ai, aj thỏa mãn aj=2*ai (iYêu cầu sử dụng thuật toán TKNP;


- Tìm cặp số ai+aj =k theo 3 cách: duyệt trâu, tk nhị phân, tìm kiếm tuần
tự.
Bài 4:
Hai người chơi như sau: Người thứ nhất sẽ nghĩ ra một số nguyên dương trong
khoảng từ 1 đến N (N được cho biết trước). Người thứ hai sẽ lần lượt đưa ra các
số dự đoán. Với mỗi số dự đoán này, người thứ hai sẽ nhận được câu trả lời cho
biết số mình vừa nêu ra lớn hơn, nhỏ hơn, hay bằng với số mà người thứ nhất đã
nghĩ. Em hãy giúp người thứ hai chọn đúng số cần tìm với số lần đốn càng ít
càng tốt.
VD: Nhập N= 8;
N1: Đốn số : 5
N2: số bạn đốn nhỏ hơn số cần tìm;
N1: đoán số 6;
N2: Số bạn đoán lớn hơn số cần tìm.
N1: đốn số 7;
N2: Chúc mừng bạn đã đúng. Số cần tìm là 7;
Bài 5: Mảng con dài nhất mà mỗi phần tử chỉ xuất hiện 1 lần .
Input Dòng đầu tiên chứa một số ngun n:
Dịng tiếp theo có n số nguyên k1, k2,…, kn:
Output
độ dài của dãy con dài nhất mà các các phần tử chỉ xuất hiện 1 lần.
Ví dụ Input :
N= 5
1234555111

Output : 5
( Bài 5 khơng liên quan đến thuật tốn TKNP)


BUỔI 5. MẢNG CỘNG DỒN.
1, giới thiệu rand() để khởi tạo mảng ngẫu nhiên:
srand(time(0));
n=1500;
for (i=1;i<=3;i++)
a[i]=(rand() -rand() )%10; ( mảng có giá trị từ 0 đến 9)
2. BÀI TOÁN: cho mảng a(n). tính và đưa ra tổng tất cả các đoạn
con trong mảng.( đưa ra điểm đầu, điểm cuối, tổng)
Vd: a: 1 2 1
1,1: 1
1,2: 3
1,3: 6
2,2: 2
2,3: 3
3,3: 1
C1. Vét cạn:
I=1 đến n
J =i+1 đến n
Tính tổng đối với mỗi đoạn con I, j: for (i=1,
i<=j,i++) s=s+a[i];
Như vậy cần 3 vòng for, chỉ thực hiện được với mảng cỡ 2000
phần tử.


C2. Mảng tổng:
I=1 đến n

Si=s[i-1]+a[i]; (s[0]=0)
Khi đó:
I=1 n;
j=in
S[I,j] =s[j]-s[i-1] với s[0]=0;
Bài tập áp dụng:
a. Đưa ra tổng các đoạn có độ dài k;
b. Đưa ra tổng lớn nhất có độ dài k;
c. Đưa ra các đoạn có tổng bằng M dài nhất.
d. Đưa ra các đoạn có tổng bằng M, độ dài lớn hơn 3;
e. Một mảng được gọi là "đẹp" nếu mảng đó chứa một phần tử mà
phần tử đó chia mảng làm 2 phần (khơng rỗng và khơng chứa
phần tử đó) có tổng bằng nhau.
Hãy kiểm tra xem một mảng bất kì có phải là một mảng "đẹp" hay khơng?
Ví dụ:
 Với a = [1, 2, 3] thì kết quả beautifulArray(a) = false
 Với a = [1, 2, 3, 3] đầu ra của chương trình sẽ là beautifulArray(a) =
true
Chọn phần tử ở vị trí thứ 3 (tính từ trái sang), thì mảng ban đầu được
chia thành 2 phần [1,2] và [3] có tổng 2 phần bằng nhau

Buổi 6 : KỸ THUẬT TRƯỢT CỬA SỔ:




Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×