--- tags: LQDOJ title: CaiWinDao và 3 em gái author: Editorial-Slayers Team license: Public domain --- <style> .markdown-body { max-width: 2048px; } </style> $\Huge \text{🌱 CaiWinDao và 3 em gái}$ ----- ###### 🔗 Link: [[CaiWinDao và 3 em gái](https://lqdoj.edu.vn/problem/sisters)] ###### 📌 Tags: Greedy ###### 👤 Writter: @thanhchauns2 ###### 👥 Contributor: ###### 📋 Content: [TOC] ----- ## Hướng dẫn Gọi tổng số kẹo là $X$, số dư của phép chia $\frac{X}{3}$ is $Y$, bài toán có thể được chia thành một vài trường hợp: Case 1: Nếu ($Y = 0$), lấy toàn bộ số kẹo. Case 2: Nếu ($Y = 1$): - Loại bỏ một túi với số lượng kẹo chia $3$ dư $1$, hoặc - Loại bỏ hai túi với số lượng kẹo chia $3$ dư $2$. Case 3: Nếu ($Y = 2$): - Loại bỏ một túi với số lượng kẹo chia $3$ dư $2$, hoặc - Loại bỏ hai túi với số lượng kẹo chia $3$ dư $1$. Tất nhiên chúng ta cần check tính khả thi của các trường hợp, hoặc đáp án sẽ bị sai. ----- ### Code > **Time:** $O(nlogn)$ > **Space:** $O(n)$ > **Algo:** sorting > [color=lightgreen] :::success :::spoiler Code ```cpp= #include <bits/stdc++.h> using namespace std; signed main() { int a; cin >> a; long long ans = 0; vector<long long> C[3]; for (int i = 0; i < a; i++) { long long x; cin >> x; ans += x; C[x % 3].push_back(x); } for (int i = 0; i < 3; i++) sort(C[i].begin(), C[i].end()); if (ans % 3 == 0) { cout << ans / 3 << endl; return 0; } if (ans % 3 == 1) { long long k = 1e17, q = 1e17; if (!C[1].empty()) k = C[1][0]; if (C[2].size() > 1) q = C[2][0] + C[2][1]; cout << (ans - min(k, q)) / 3 << endl; return 0; } if (ans % 3 == 2) { long long k = 1e17, q = 1e17; if (!C[2].empty()) k = C[2][0]; if (C[1].size() > 1) q = C[1][0] + C[1][1]; cout << (ans - min(k, q)) / 3 << endl; return 0; } } ``` ::: ----- ## Bonus Bạn có thể giải với trường hợp mỗi gói kẹo chỉ chia cho 1 người không?