fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int N, M, cost, ans;
  5. vector<int> s, t, c, a, b, p, m, temperature;
  6.  
  7. void Try(int k) {
  8. for (int i = 1; i >= 0; --i) { // Đang xét điều hòa thứ k (có thể chọn (i=1) hoặc không chọn (i=0)).
  9. if (i == 1) { // Nếu chọn điều hòa thứ k,
  10. cost += m[k]; // cộng thêm vào chi phí hiện tại (cost),
  11. for (int j = a[k]; j <= b[k]; ++j) {
  12. temperature[j] -= p[k]; // giảm nhiệt độ các ô tương ứng nếu chọn điều hòa thứ k
  13. }
  14. }
  15. if (k == M) { // Nếu đã xét đến điều hòa cuối cùng (mỗi điều hòa đều có trạng thái chọn hoặc không chọn) thì tiến hành kiểm tra cách chọn hiện tại.
  16. bool checking = true; // Kiểm tra các con bò có thỏa mãn hay không.
  17. for (int j = 1; j <= N; ++j) {
  18. bool valid = true; // Kiểm tra mọi ô của con bò thứ j có thỏa mãn hay không.
  19. for (int l = s[j]; l <= t[j]; ++l) { // Duyệt qua các ô của con bò thứ j.
  20. if (temperature[l] > -c[j]) { // Nếu tồn tại một ô chưa đủ mát,
  21. valid = false; // thì con bò j không thỏa mãn,
  22. break; // và lập tức dừng, không cần kiểm tra các ô khác của con bò này.
  23. }
  24. }
  25. if (!valid) { // Nếu có tồn tại một con bò không thỏa mãn,
  26. checking = false; // thì cách chọn điều hòa hiện tại không thỏa mãn,
  27. break; // và lập tức dừng, không cần kiểm tra các con bò khác
  28. }
  29. }
  30. if (checking) { // Nếu cách chọn điều hòa này thỏa mãn toàn bộ các con bò,
  31. ans = min(ans, cost); // thì cập nhật đáp án.
  32. }
  33. } else { // Nếu điều hòa đang xét chưa phải điều hòa cuối cùng,
  34. Try(k + 1); // thì xét tiếp điều hòa k+1.
  35. }
  36. if (i == 1) { // Nếu lúc nãy có chọn điều hòa thứ k, thì phải trả lại trạng thái ban đầu trước khi chọn điều hòa thứ k.
  37. cost -= m[k]; // Lúc nãy có cộng chi phí vào nếu chọn điều hòa thứ k, thì bây giờ phải trừ đi.
  38. for (int j = a[k]; j <= b[k]; ++j) {
  39. temperature[j] += p[k]; // Lúc nãy có trừ nhiệt độ nếu chọn điều hòa thứ k, thì bây giờ phải cộng lên.
  40. }
  41. }
  42. }
  43. }
  44.  
  45. void Solve() {
  46. // Nhập dữ liệu
  47. cin >> N >> M;
  48. s.resize(N + 1), t.resize(N + 1), c.resize(N + 1);
  49. for (int i = 1; i <= N; ++i) {
  50. cin >> s[i] >> t[i] >> c[i];
  51. }
  52. a.resize(M + 1), b.resize(M + 1), p.resize(M + 1), m.resize(M + 1);
  53. for (int i = 1; i <= M; ++i) {
  54. cin >> a[i] >> b[i] >> p[i] >> m[i];
  55. }
  56. temperature.assign(101, 0); // Ban đầu nhiệt độ của 100 ô bằng 0.
  57. ans = 1e9; // lưu kết quả (answer)
  58. Try(1); // Đệ quy để xét toàn bộ các cách chọn điều hòa (mỗi điều hòa từ thứ 1 đến thứ M phải có một trong hai trạng thái: chọn hoặc không chọn).
  59. cout << ans;
  60. }
  61.  
  62. int main() {
  63. ios_base :: sync_with_stdio(false); cin.tie(0); cout.tie(0);
  64. if (fopen("test.inp", "r")) {
  65. freopen("test.inp", "r", stdin);
  66. freopen("test.out", "w", stdout);
  67. }
  68. Solve();
  69. }
Success #stdin #stdout 0s 5320KB
stdin
2 4
1 5 2
7 9 3
2 9 2 3
1 6 2 8
1 2 4 2
6 9 1 5
stdout
10