Link
- Codeforces Round #377 Div. 2 (Contest 732)
A. Buy a Shovel
It can be paid without change if the change is 0 or \(r\).
#include <cstdio> #include <iostream> using namespace std; int main(){ #ifndef ONLINE_JUDGE freopen("a3.in", "r", stdin); #endif int k, r; scanf("%d %d", &k, &r); int i; for (i = 1; i < 10; ++i) { int change = k * i % 10; if (change == 0 || change == r) break; } printf("%d", i); return 0; }
B. Cormen — The Best Friend Of a Man
At day \(i\), dog need to walk \(k−a[i−1]\) times./* * */ #include <cstdio> #include <iostream> using namespace std; int a[505]; int main(){ #ifndef ONLINE_JUDGE freopen("b3.in", "r", stdin); #endif int n, k; scanf("%d %d", &n, &k); for (int i = 0; i < n; ++i) { scanf("%d", &a[i]); } int inc = 0; for (int i = 1; i < n; ++i) { if (a[i-1] + a[i] >= k) continue; inc += k - a[i-1] - a[i]; a[i] = k - a[i-1]; } printf("%d\n", inc); for (int i = 0; i < n; ++i) { printf("%d%c", a[i], i==n-1 ? '\n' : ' '); } return 0; }
C. Sanatorium
Basic idea to the solution is not difficult, just check all the popssibility of what time start eating (enter room) and what time end eating (exit room). But the corner case handling makes this problem difficult and I cannot answer correctly in one time.
Rather than below, more elegant/ short code solution can be found at pekempey’s solution.
#include <cstdio> #include <iostream> using namespace std; typedef long long ll; int main(){ #ifndef ONLINE_JUDGE freopen("c4.in", "r", stdin); #endif ll b[3]; cin >> b[0] >> b[1] >> b[2]; ll minimum = 3000000000000000000LL; for (int i = 0; i < 3; ++i) {// 0: 0,0,0. 1: 0,0,1, 2: 0,1,1 for (int k = 0; k < i; ++k) { b[2-k]--; } for (int j = 0; j < 3; ++j) {// 0: 0,0,0. 1: 1,0,0, 2: 1,1,0 for (int k = 0; k < j; ++k) { b[k]--; } ll missed = 0; ll middleDay = max(max(b[0], b[1]), b[2]); if (middleDay >= 0) { missed += middleDay*3 - (b[0]+b[1]+b[2]); minimum = min(minimum, missed); } for (int k = 0; k < j; ++k) { b[k]++; } } for (int k = 0; k < i; ++k) { b[2-k]++; } } if (b[0] == 0 && b[1] == 1 && b[2] == 0) minimum = 0; cout << minimum; return 0; }
D. Exams
Use binary search. Fix the duration x days, and we can check if it is possible to pass all the tests in x days or not.
In each check it costs \(O(N)\), so in total it takes \(O(NlogN)\) to find the solution./* * Binary search * O(NlogN) * * Check if all tests can be passed by n days or not. */ #include <cstdio> #include <iostream> using namespace std; int n, m; int d[100005]; int a[100005]; bool used[100005]; //Check if all tests can be passed by x days or not. bool C(int x) { used[0] = true; for (int i = 1; i <= m; ++i) { used[i] = false; // init } int passed = 0; // #of passed subject int day = 0; // total necessary preparation days for (int i = x - 1; i >= 0; --i) { if (!used[d[i]]) { // take exam of d[i] passed++; day += a[d[i]]; used[d[i]] = true; } else { // study subject of used[d[i]] == true. if(day > 0) day--; } } if (passed == m && day == 0) return true; else return false; } int main(){ #ifndef ONLINE_JUDGE freopen("d3.in", "r", stdin); #endif scanf("%d %d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%d", &d[i]); } for (int i = 1; i <= m; ++i) { scanf("%d", &a[i]); } int lb=0, ub=n; // can do between (lb, ub] while (ub - lb > 1) { int middle = (lb+ub)/2; if (C(middle)) ub = middle; else lb = middle; //cout << lb << " " << ub << " " << middle << endl; } if (ub == n && !C(n)) ub = -1; printf("%d\n", ub); return 0; }