Codeforces round #273 (Div. 2)
Question Link
A: sign in. You only need to determine whether the sum is a multiple of 5. Pay attention to 0.
B: When the maximum value is set, one is first placed for each set, and the rest is dropped to one set. The minimum value is the average score as much as possible.
C: If the three balls are A, B, and C from small to large, then the obvious answer (a + B) 2 <= C is a + B, because C must be left. If (a + B) 2> C, it will certainly be able to construct the optimal (A + B + C)/3, because it is certainly possible to take a and B to eliminate c first, and control the relationship between A and B to double or eliminate a pile, so that the remaining two stacks should be the same as possible.
D: DP, calculate the maximum height h first, and then 1 to h each column is regarded as an item, which is to select several components R and evaluate the number of conditions, we can solve this problem with the 01 backpack.
Code:
A:
#include <cstdio>#include <cstring>int c, sum = 0;int main() {for (int i = 0; i < 5; i++) {scanf("%d", &c);sum += c;}if (sum == 0 || sum % 5) printf("-1\n");else printf("%d\n", sum / 5);return 0;}
B:
#include <cstdio>#include <cstring>typedef long long ll;ll n, m;int main() {scanf("%lld%lld", &n, &m);ll yu = n - m + 1;ll Max = yu * (yu - 1) / 2;yu = n % m;ll sb = n / m;ll sbb = sb + 1;ll Min = 0;if (sbb % 2) {Min += yu * (sbb - 1) / 2 * sbb;} else Min += yu * sbb / 2 * (sbb - 1);if (sb % 2) {Min += (m - yu) * (sb - 1) / 2 * sb;} else Min += (m - yu) * sb / 2 * (sb - 1);printf("%lld %lld\n", Min, Max);return 0;}
C:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;ll a[3], ans = 0;int main() {for (ll i = 0; i < 3; i++)scanf("%lld", &a[i]);sort(a, a + 3);if ((a[0] + a[1]) * 2 >= a[2]) printf("%lld\n", (a[0] + a[1] + a[2]) / 3);else printf("%lld\n", a[0] + a[1]);return 0;}
D:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int N = 200005;const ll MOD = 1000000007;ll r, g;int n;ll dp[N];int main() {scanf("%lld%lld", &r, &g);if (r > g) swap(r, g);ll sum = 0;for (int i = 1; ;i++) {sum += i;if (sum >= r + g) {if (sum > r + g) {sum -= i;i--;}n = i;break;}}dp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = r; j >= i; j--) {dp[j] = dp[j] + dp[j - i];if (dp[j] > MOD) dp[j] -= MOD;}}ll sb = 0;for (int i = 0; i <= r + g - sum; i++) {if (r < i) break;sb = (dp[r - i] + sb) % MOD;}printf("%lld\n", sb);return 0;}
Codeforces round #273 (Div. 2)