Thảo luậnSnackDown Online Qualifier 2017 - Snake Eating

8 bài đăng
21.05.2017 / 15:10
MrKen
Bài đăng: 2653
Trùm!
Vẫn là A N H

Chef vừa mua rất nhiều rắn và những con rắn này đang rất đói nên đang ăn thịt lẫn nhau. Mỗi con rắn thứ i có chiều dài là Li, bạn đã biết chiều dài ban đầu của nó. Một con rắn có thể ăn bất cứ con rắn nào không dài hơn nó. Ví dụ, một con rắn i sẽ có thể ăn một con rắn j (i ≠ j), nếu Li ≥ Lj. Và khi một con rắn ăn một con rắn khác, chiều dài của nó sẽ tăng lên 1. Tức là Li tăng thêm 1.

Chef không để ý về việc các con rắn đang ăn thịt nhau. Tất cả những gì anh ấy muốn là có càng nhiều rắn càng tốt mà chiều dài ít nhất phải bằng một giá trị cụ thể. Bạn được cho Q giá trị K1, K2, .., KQ. Hãy in ra câu trả lời độc lập đối với từng giá trị. Cụ thể, với mỗi Ki, giả sử rằng bạn bắt đầu từ đầu với tất cả các con rắn còn sống và chiều dài như các giá trị ban đầu được đưa ra trong dữ liệu đầu vào và bạn phải tìm ra số rắn lớn nhất mà chiều dài của mỗi con rắn đó ít nhất bằng Ki.

Dữ liệu vào

- Dòng đầu tiên chứa một số nguyên T – số test. Các test được miêu tả như sau:

- Dòng đầu tiên của mỗi test chứa hai số nguyên N và Q lần lượt là số rắn ban dầu và số lượng truy vấn.

- Dòng thứ hai của mỗi test chứa N số nguyên L1, L2, .., LN, thể hiện chiều dài ban đầu của các con rắn.

- Dòng thứ i trong Q dòng tiếp theo chứa một số nguyên duy nhất là Ki.

Dữ liệu ra

- Ở mỗi test, in ra Q dòng, dòng thứ i có một số nguyên duy nhất: số lượng rắn nhiều nhất mà Chef có với chiều dài mỗi con ít nhất bằng Ki.

Ràng buộc

- 1 ≤ T ≤ 5

- 1 ≤ N, Q ≤ 10^5

- 1 ≤ Li ≤ 10^9

- 1 ≤ Ki ≤ 10^9

Ví dụ

Input:

TEXT
  1. 2
  2. 5 2
  3. 21 9 5 8 10
  4. 10
  5. 15
  6. 5 1
  7. 1 2 3 4 5
  8. 100

Output:

TEXT
  1. 3
  2. 1
  3. 0

Giải thích

Trong test đầu tiên, truy vấn thứ nhất, con rắn thứ hai (độ dài 9) có thể ăn con rắn thứ tư (độ dài 8), do đó chiều dài sau đó của nó là 10. Bây giờ, có 4 con rắn còn lại, và chiều dài của chúng là {21, 10, 5, 10}. Do đó, chúng ta có ba con rắn với chiều dài ≥ 10: hai con trong số chúng có chiều dài là 10 và một con dài 21. Đây là cách tốt nhất bạn có thể làm.

Ở truy vấn thứ hai, bất luận điều gì xảy ra, bạn cũng không thể có nhiều hơn một con rắn có chiều dài là 15.

Trong test thứ hai, bất luận điều gì xảy ra, bạn cũng không thể có bất cứ con rắn nào có chiều dài ≥ 100. Do đó câu trả lời là 0.

____________

Time Limit: 2 secs

Source Limit: 50000 Bytes

Languages: ADA, ASM, BASH, BF, C, C99 strict, CAML, CLOJ, CLPS, CPP 4.3.2, CPP 4.9.2, CPP14, CS2, D, ERL, FORT, FS, GO, HASK, ICK, ICON, JAVA, JS, LISP clisp, LISP sbcl, LUA, NEM, NICE, NODEJS, PAS fpc, PAS gpc, PERL, PERL6, PHP, PIKE, PRLG, PYPY, PYTH, PYTH 3.4, RUBY, SCALA, SCM chicken, SCM guile, SCM qobi, ST, TCL, TEXT, WSPC

Đã chỉnh sửa. MrKen (21.05.2017 / 22:00)
21.05.2017 / 19:11
tnit2510
Bài đăng: 970
Member

Chả hiểu, và nó là gì v??

21.05.2017 / 19:24
MrKen
Bài đăng: 2653
Trùm!
Vẫn là A N H

Viết code theo yêu cầu =))

21.05.2017 / 20:02
tnit2510
Bài đăng: 970
Member
MrKen đã viết

Viết code theo yêu cầu =))

Viết đê :))

21.05.2017 / 20:05
MrKen
Bài đăng: 2653
Trùm!
Vẫn là A N H

Viết rồi, test OK rồi =))

21.05.2017 / 20:10
tnit2510
Bài đăng: 970
Member
MrKen đã viết

Viết rồi, test OK rồi =))

Share đê :))

21.05.2017 / 21:51
MrKen
Bài đăng: 2653
Trùm!
Vẫn là A N H

Code bị limit. Pro fix hộ :yao:

Code C++:

CPP
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int t, n, q, k;
  4. int main() {
  5. cin >> t;
  6. for (int a = 0; a < t; a++) {
  7. cin >> n;
  8. cin >> q;
  9. int l[n];
  10. for (int b = 0; b < n; b++) {
  11. cin >> l[b];
  12. }
  13. sort(l, l+n, greater<int>());
  14. for (int c = 0; c < q; c++) {
  15. cin >> k;
  16. int r = 0;
  17. if (l[0] + n - 1 < k) {
  18. cout << "0\n";
  19. break;
  20. }
  21. int p = n;
  22. for (int c = 0; c < p; c++) {
  23. if (l[c] >= k) {
  24. r++;
  25. } else {
  26. if (l[c] + p - c - 1 >= k) {
  27. r++;
  28. p = p - (k - l[c]);
  29. } else {
  30. break;
  31. }
  32. }
  33. }
  34. cout << r << "\n";
  35. }
  36. }
  37. return 0;
  38. }
Đã chỉnh sửa. MrKen (25.05.2017 / 17:29)
21.05.2017 / 23:43
Cvhungs20
Bài đăng: 55
Member
Vnlove.tk
CPP
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4.  
  5. int main() {
  6. scanf("%d", & t);
  7. while (t--) {
  8. scanf("%d %d", & n, & q);
  9. for (int i = 1; i <= n; i++) scanf("%lld", & l[i]);
  10. sort(l + 1, l + n + 1);
  11. ll x;
  12. int ans = 0;
  13. for (int i = 1; i <= q; i++) {
  14. scanf("%lld", & x);
  15. int id = lower_bound(l + 1, l + n + 1, x) - l;
  16. id--;
  17. ans = n - id;
  18. int fin = 1;
  19. for (int j = id; j >= fin; j--) {
  20. int v = x - l[j];
  21. if (v <= j - fin) ans++, fin += v;
  22. else break;
  23. }
  24. printf("%d\n", ans);
  25. }
  26.  
  27. }
  28. return 0;
  29. }
Đã chỉnh sửa. MrKen (22.05.2017 / 09:05)