01/10/2018, 01:02

Giúp mình giải thuật giải bài dựng hình

mình gặp cái đề này trên spoj mà làm mãi nó vẫn báo sai.
Input
Dòng thứ nhất chứa 2 số N (1 <= N <= 10), số góc mà Tí có thể vẽ được, và số K (1 <= K <= 10) là số góc mà Tèo chọn.
Dòng thứ 2 chứa N số nguyên, tất cả đều nhỏ hơn 360, là các góc mà Tí có thể vẽ được.
Dòng thứ 3 chứa K số nguyên, tất cả đều nhỏ hơn 360, là các góc mà Tèo chọn.
output
n ra đáp án trên K dòng, mỗi dòng tương ứng với một góc mà Tèo chọn. Dòng thứ i ghi ra “YES” nếu Tí có thể tạo ra góc thứ i mà Tèo đã chọn, và “NO” nếu ngược lại.
ví dụ :Test 1:

Input:

2 1
30 70
40

Output:

YES

Test 2:

Input:

1 1
100
60

Output:

YES

Test 3:

Input:

3 2
10 20 30
5 70

Output:

NO
YES

Giải thích test 1:

  • Tí có thể tạo ra góc 40 nếu lấy góc 70 trừ đi góc 30

Giải thích test 2:

  • tí có thể vẽ 15 lần góc 100 , sẽ được góc 1500 và góc 1500 = góc 60 mà tèo yêu cầu.
    cám ơn các bạn nhiều lắm…mình chỉ mới biết dùng C thôi các bạn hướng dẫn mình nhé
songoku_777 viết 03:03 ngày 01/10/2018

note ở đây cuối tuần làm :))) nhưng chắc là sử dụng tính chia hết để kiểm tra

Nguyễn Xuân Phúc viết 03:14 ngày 01/10/2018

Bài này có ít nhất là 2 cách làm:

  • Dùng toán: nếu góc gọi g = GCD(x, 360), thì ta có thể thấy rằng, mọi góc mà là bội của g thì sẽ tạo được bằng cách lấy nhiều lần x. Như vậy, nếu ta tính GCD của các góc Tí vẽ được với 360, sẽ ra góc đơn vị nhỏ nhất mà Tí có thể vẽ được. Và mọi góc mà Tí vẽ được đều chia hết cho góc này. Sau đó đọc từng số trong K số yêu cầu, nếu nó chia hết cho góc đơn vị thì YES, ngược lại NO. Độ phức tạp: O(Nlog360 + K)
  • Dùng Quy hoạch động: gọi F[i] đánh dấu là Tí vẽ được góc i hay không. Dễ thấy, nếu ta chọn ra 1 cặp góc (x, y) bất kì, thì có thể vẽ được 2 góc (x+y) và (x-y). Và mặc định góc 0o là luôn vẽ được. Nêu khi đọc từng số a trong n số, ta sẽ lặp, duyệt từ 0 đến 360, nếu i đã vẽ được, thì ta thấy có thể vẽ thêm góc (i+a) và (i-a), nếu 2 góc chưa được vẽ thì ta vẽ và đánh dấu là có góc mới. Ta cứ lặp như vậy cho đến khi nào hết vẽ được góc mới thì thôi. Dễ thấy, sau khi xử lý hết N số ban đầu, tổng số vòng lặp tối đa là 360 (vì mỗi góc chỉ vẽ 1 lần, 360 góc mới thì tối đa 360 vòng lặp để vẽ). Khi đã có mảng F thì việc trả lời câu hỏi chỉ cần O(1) cho mỗi câu hỏi. Nên độ phức tạp là O(3602 + K).
Nguyễn Xuân Phúc viết 03:12 ngày 01/10/2018

Mà lần sau post bài thì nhớ post luôn cái đề nhá, chơi post input output cho người ta đoán đề à :v

Bài liên quan
0