Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)

Educational Codeforces Round 90 (Rated for Div. 2)

Donut Shops

思路

分三种情况:

  • a = = c / b a == c / b 这个时候两个的单价是相同的,如果 b = = 1 b == 1 ,也就是 a = = c a == c ,无论买多少数量的东西,这两个的价格都是一样的,直接输出"-1 -1",否则的话,只要输出"%d -1", %d可以是小于b大于1的任意数字。
  • a > c / b a > c / b ,如果 a < c a < c ,直接输出"1 b"即可,否则输出"-1 b"。
  • a < c / b a < c / b ,这里一定是对于a是最优的,所以可以购买任意数量的a,即"1 -1"也是满足条件的。

代码

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;

const double eps = 1e-7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    } 
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int _ = read();
    while(_--) {
        ll a = read(), b = read(), c = read();
        if(double(c) / (double)b < a) {
            if(a < c)   printf("%d %d\n", 1, b);
            else printf("%d %d\n", -1, b);
        }
        else if(double(c) / b == a) {
            if(b == 1)  puts("-1 -1");
            else puts("1 -1");
        }
        else {// a < c / b
            printf("%d -1\n", 1);
        }
    }
    return 0;
}

01 Game

思路

直接用栈模拟,得到最多的可消去的数量,然后判断其是奇数还是偶数即可。

代码

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;

const double eps = 1e-7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    } 
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int _;
    cin >> _;
    while(_--) {
        string str;
        cin >> str;
        stack<char> stk;
        int n = str.size(), num = 0;
        for(int i = 0; i < n; i++) {
            if(stk.empty() || stk.top() == str[i]) {
                stk.push(str[i]);
                continue;
            }
            if(stk.top() != str[i]) {
                // cout << i << endl;
                num++;
                stk.pop();
                // continue;
            }
        }
        // cout << num << endl;
        if(num & 1) cout << "DA\n";
        else    cout << "NET\n";
    }
    return 0;
}

Pluses and Minuses

思路

res = 0
for init = 0 to inf
    cur = init
    ok = true
    for i = 1 to |s|
        res = res + 1
        if s[i] == '+'
            cur = cur + 1
        else
            cur = cur - 1
        if cur < 0
            ok = false
            break
    if ok
        break

-+串可以看作是一个前缀串,当我们的 i n i t init 与当前缀和相加的时候是负数的时候,我们将在这个点停止, r e s res 的增加值就是这个点的数组下标,所以我们可以直接遍历一遍 c u r cur 停止的点,然后加上这个点的数组下标,因为我们最后跳出循环的条件是当前枚举的 i n i t init 是严格大于这个数组中的所有非负值,所以我们还需要加上我们最后一遍遍历数组的值,也就是串的长度。

代码

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;

const double eps = 1e-7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    } 
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}

const int N = 1e6 + 10;

char str[N];
int n;

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int _;
    cin >> _;
    while(_--) {
        scanf("%s", str + 1);
        n = strlen(str + 1);
        ll ans = 0, sum = 0;
        for(int i = 1; i <= n; i++) {
            if(str[i] == '+')   sum++;
            else    sum--;
            if(sum < 0) {//表示我们当前的cur将会变成负数,这个时候跳出循环,
                //所以我们要重置0,因为我们在下一个枚举的cur在这个点一定会是0,然后继续枚举下一个停止点。
                ans += i;
                sum = 0;
            }
        }
        printf("%lld\n", ans + n);
    }
    return 0;
}

Maximum Sum on Even Positions

思路

容易想到一定是在某一段是"奇偶奇偶……奇偶"或者是"偶奇偶奇……偶奇"这样的反转。那么我们就需要贪心的选取这些数段了,也就是奇数 - 偶数是最大的一段,这一步我们容易想到最大字段和的 d p dp ,想到这里我们就应该可以写出这道题了。

首先我们记录下所有偶数下标的和 s u m 1 sum1 ,然后通过上面的思想去找到一个最大子段的 s u m 2 = sum2 = 奇数 - 偶数 的值,然后只需要 s u m 1 + s u m 2 sum1 + sum2 就可以得到我们的正确答案了, s u m 1 + s u m 2 = s u m 1 + ( ) sum1 + sum2 = sum1 + 某一段(奇数 - 偶数) ,这个式子中正好去除了我们选取的子段中偶数下标在 s u m 1 sum1 中的值,然后加上我们选取的子段中奇数下标的值,也就是我们反转后的答案值。

代码

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;

const double eps = 1e-7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    } 
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}

const int N = 2e5 + 10;

ll a[N];
int n;

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int _;
    cin >> _;
    while(_--) {
        n = read();
        ll sum1 = 0, sum2 = 0;
        for(int i = 0; i < n; i++) {
            a[i] = read();
            if(!(i & 1))    sum1 += a[i];
        }
        ll ans = 0, now = 0, temp = 0;
        for(int i = 1; i < n; i += 2) {
            now += a[i] - a[i - 1];
            ans = max(ans, now);
            if(now < 0) now = 0;
        }
        now = 0, temp = 0;
        for(int i = 2; i < n; i += 2) {
            now += a[i - 1] - a[i];
            ans = max(ans, now);
            if(now < 0) now = 0;
        }
        printf("%lld\n", ans + sum1);
    }
    return 0;
}

Sum of Digits

打表

先对 k k 是0的答案自己构造一下,然后就开始打表,分析最大的150,k = 1 时的情况,9 * 8 = 72,所以大概可以断定我们的打表最大值不超过1e9,然后开始了 1 e 10 1e10 复杂度的打表,实际上应该不到这个复杂度,两分钟就可以打出表,然后直接cv大法即可。

在这里插入图片描述

打表代码

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;

const double eps = 1e-7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    } 
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}

ll ans[151][10];

int get(ll x) {
    int sum = 0;
    while(x) {
        sum += x % 10;
        x /= 10;
    }
    return sum;
}

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    for(int i = 0; i <= 150; i++)
        for(int j = 0; j <= 9; j++)
            ans[i][j] = 1e18 + 10;
    for(int i = 1; i <= 150; i++) {
        int temp = i;
        ll Ans = 0, add = 1;
        while(temp) {
            if(temp >= 9) {
                temp -= 9;
                Ans += add * 9;
                add *= 10;
            }
            else {
                Ans += add * temp;
                add *= 10;
                temp = 0;
            }
        }
        // cout << i << " " << Ans << endl;
        ans[i][0] = Ans;
    }
    int num = 0;
    for(ll i = 0; i <= 1000000010; i++) {
        if(i % 10000000 == 0) printf("%lld\n", i / 10000000);
        //显示暴力进度。
        int sum = get(i);
        for(int j = 1; j <= 9; j++) {
            sum += get(i + j);
            if(sum > 150)   break;
            ans[sum][j] = min(ans[sum][j], i);
        }
    }
    for(int i = 0; i <= 150; i++) {
        for(int j = 0; j <= 9; j++)
            if(ans[i][j] != 1e18 + 10)  printf("%lld, ", ans[i][j]);
            else printf("-1, ");
        puts("");
    }
    return 0;
}

AC代码

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;

const double eps = 1e-7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    } 
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}

ll ans[151][10] = {
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 0, -1, -1, -1, -1, -1, -1, -1, -1,
2, -1, -1, -1, -1, -1, -1, -1, -1, -1,
3, 1, 0, -1, -1, -1, -1, -1, -1, -1,
4, -1, -1, -1, -1, -1, -1, -1, -1, -1,
5, 2, -1, -1, -1, -1, -1, -1, -1, -1,
6, -1, 1, 0, -1, -1, -1, -1, -1, -1,
7, 3, -1, -1, -1, -1, -1, -1, -1, -1,
8, -1, -1, -1, -1, -1, -1, -1, -1, -1,
9, 4, 2, -1, -1, -1, -1, -1, -1, -1,
19, 9, -1, 1, 0, -1, -1, -1, -1, -1,
29, 5, -1, -1, -1, -1, -1, -1, -1, -1,
39, 19, 3, -1, -1, -1, -1, -1, -1, -1,
49, 6, -1, -1, -1, -1, -1, -1, -1, -1,
59, 29, -1, 2, -1, -1, -1, -1, -1, -1,
69, 7, 4, 9, 1, 0, -1, -1, -1, -1,
79, 39, -1, -1, -1, -1, -1, -1, -1, -1,
89, 8, -1, -1, -1, -1, -1, -1, -1, -1,
99, 49, 5, 3, -1, -1, -1, -1, -1, -1,
199, 18, -1, 19, 9, -1, -1, -1, -1, -1,
299, 59, -1, 8, 2, -1, -1, -1, -1, -1,
399, 28, 6, -1, -1, 1, 0, -1, -1, -1,
499, 69, -1, 4, -1, -1, -1, -1, -1, -1,
599, 38, -1, 29, 8, -1, -1, -1, -1, -1,
699, 79, 7, 18, 19, 9, -1, -1, -1, -1,
799, 48, -1, 7, 3, -1, -1, -1, -1, -1,
899, 89, -1, 5, -1, -1, -1, -1, -1, -1,
999, 58, 17, 39, 7, 2, -1, -1, -1, -1,
1999, 189, -1, 28, 18, -1, 1, 0, -1, -1,
2999, 68, -1, 17, 29, -1, -1, -1, -1, -1,
3999, 289, 27, 6, 4, 7, 9, -1, -1, -1,
4999, 78, -1, 49, 6, -1, -1, -1, -1, -1,
5999, 389, -1, 38, 17, -1, 8, -1, -1, -1,
6999, 88, 37, 27, 28, 3, -1, -1, -1, -1,
7999, 489, -1, 16, 39, -1, 7, -1, -1, -1,
8999, 98, -1, 59, 5, -1, 2, -1, -1, -1,
9999, 589, 47, 48, 16, 5, 6, 1, 0, -1,
19999, 198, -1, 37, 27, -1, 19, 9, -1, -1,
29999, 689, -1, 26, 38, -1, 5, 8, -1, -1,
39999, 298, 57, 69, 49, 4, 18, 7, -1, -1,
49999, 789, -1, 58, 15, -1, 4, 6, -1, -1,
59999, 398, -1, 47, 26, -1, 17, 5, -1, -1,
69999, 889, 67, 36, 37, 15, 3, 4, -1, -1,
79999, 498, -1, 79, 48, -1, 16, 3, -1, -1,
89999, 989, -1, 68, 59, -1, 29, 2, -1, -1,
99999, 598, 77, 57, 25, 14, 15, 19, 1, 0,
199999, 1989, -1, 46, 36, -1, 28, 18, -1, 1,
299999, 698, -1, 89, 47, -1, 14, 17, -1, 2,
399999, 2989, 87, 78, 58, 25, 27, 16, -1, 3,
499999, 798, -1, 67, 69, -1, 13, 15, -1, 4,
599999, 3989, -1, 56, 35, -1, 26, 14, -1, 5,
699999, 898, 97, 189, 46, 24, 39, 13, -1, 6,
799999, 4989, -1, 88, 57, -1, 25, 12, -1, 7,
899999, 998, -1, 77, 68, -1, 38, 29, -1, 8,
999999, 5989, 197, 66, 79, 35, 24, 28, 11, 9,
1999999, 1998, -1, 289, 45, -1, 37, 27, -1, 10,
2999999, 6989, -1, 188, 56, -1, 23, 26, -1, 11,
3999999, 2998, 297, 87, 67, 34, 36, 25, -1, 12,
4999999, 7989, -1, 76, 78, -1, 49, 24, -1, 13,
5999999, 3998, -1, 389, 89, -1, 35, 23, -1, 14,
6999999, 8989, 397, 288, 55, 45, 48, 22, -1, 15,
7999999, 4998, -1, 187, 66, -1, 34, 39, -1, 16,
8999999, 9989, -1, 86, 77, -1, 47, 38, -1, 17,
9999999, 5998, 497, 489, 88, 44, 33, 37, 21, 18,
19999999, 19989, -1, 388, 189, -1, 46, 36, -1, 19,
29999999, 6998, -1, 287, 65, -1, 59, 35, -1, 20,
39999999, 29989, 597, 96, 76, 55, 45, 34, -1, 21,
49999999, 7998, -1, 589, 87, -1, 58, 33, -1, 22,
59999999, 39989, -1, 488, 188, -1, 44, 32, -1, 23,
69999999, 8998, 697, 387, 289, 54, 57, 49, -1, 24,
79999999, 49989, -1, 196, 75, -1, 43, 48, -1, 25,
89999999, 9998, -1, 689, 86, -1, 56, 47, -1, 26,
99999999, 59989, 797, 588, 187, 65, 69, 46, 31, 27,
199999999, 19998, -1, 487, 288, -1, 55, 45, -1, 28,
299999999, 69989, -1, 296, 389, -1, 68, 44, -1, 29,
399999999, 29998, 897, 789, 85, 64, 54, 43, -1, 30,
499999999, 79989, -1, 688, 186, -1, 67, 42, -1, 31,
599999999, 39998, -1, 587, 287, -1, 53, 59, -1, 32,
699999999, 89989, 997, 396, 388, 75, 66, 58, -1, 33,
799999999, 49998, -1, 889, 489, -1, 79, 57, -1, 34,
899999999, 99989, -1, 788, 95, -1, 65, 56, -1, 35,
999999999, 59998, 1997, 687, 286, 74, 78, 55, 41, 36,
1999999999, 199989, -1, 496, 387, -1, 64, 54, -1, 37,
2999999999, 69998, -1, 989, 488, -1, 77, 53, -1, 38,
3999999999, 299989, 2997, 888, 589, 85, 63, 52, -1, 39,
4999999999, 79998, -1, 787, 195, -1, 76, 69, -1, 40,
5999999999, 399989, -1, 596, 386, -1, 89, 68, -1, 41,
6999999999, 89998, 3997, 1989, 487, 84, 75, 67, -1, 42,
7999999999, 499989, -1, 988, 588, -1, 88, 66, -1, 43,
8999999999, 99998, -1, 887, 689, -1, 74, 65, -1, 44,
9999999999, 599989, 4997, 696, 295, 185, 87, 64, 51, 45,
19999999999, 199998, -1, 2989, 486, -1, 73, 63, -1, 46,
29999999999, 699989, -1, 1988, 587, -1, 86, 62, -1, 47,
39999999999, 299998, 5997, 987, 688, 94, 189, 79, -1, 48,
49999999999, 799989, -1, 796, 789, -1, 85, 78, -1, 49,
59999999999, 399998, -1, 3989, 395, -1, 188, 77, -1, 50,
69999999999, 899989, 6997, 2988, 586, 285, 84, 76, -1, 51,
79999999999, 499998, -1, 1987, 687, -1, 187, 75, -1, 52,
89999999999, 999989, -1, 896, 788, -1, 83, 74, -1, 53,
99999999999, 599998, 7997, 4989, 889, 194, 186, 73, 61, 54,
199999999999, 1999989, -1, 3988, 495, -1, 289, 72, -1, 55,
299999999999, 699998, -1, 2987, 686, -1, 185, 89, -1, 56,
399999999999, 2999989, 8997, 996, 787, 385, 288, 88, -1, 57,
499999999999, 799998, -1, 5989, 888, -1, 184, 87, -1, 58,
599999999999, 3999989, -1, 4988, 989, -1, 287, 86, -1, 59,
699999999999, 899998, 9997, 3987, 595, 294, 93, 85, -1, 60,
799999999999, 4999989, -1, 1996, 786, -1, 286, 84, -1, 61,
899999999999, 999998, -1, 6989, 887, -1, 389, 83, -1, 62,
999999999999, 5999989, 19997, 5988, 988, 485, 285, 82, 71, 63,
1999999999999, 1999998, -1, 4987, 1989, -1, 388, 189, -1, 64,
2999999999999, 6999989, -1, 2996, 695, -1, 284, 188, -1, 65,
3999999999999, 2999998, 29997, 7989, 886, 394, 387, 187, -1, 66,
4999999999999, 7999989, -1, 6988, 987, -1, 193, 186, -1, 67,
5999999999999, 3999998, -1, 5987, 1988, -1, 386, 185, -1, 68,
6999999999999, 8999989, 39997, 3996, 2989, 585, 489, 184, -1, 69,
7999999999999, 4999998, -1, 8989, 795, -1, 385, 183, -1, 70,
8999999999999, 9999989, -1, 7988, 986, -1, 488, 92, -1, 71,
9999999999999, 5999998, 49997, 6987, 1987, 494, 384, 289, 81, 72,
19999999999999, 19999989, -1, 4996, 2988, -1, 487, 288, -1, 73,
29999999999999, 6999998, -1, 9989, 3989, -1, 293, 287, -1, 74,
39999999999999, 29999989, 59997, 8988, 895, 685, 486, 286, -1, 75,
49999999999999, 7999998, -1, 7987, 1986, -1, 589, 285, -1, 76,
59999999999999, 39999989, -1, 5996, 2987, -1, 485, 284, -1, 77,
69999999999999, 8999998, 69997, 19989, 3988, 594, 588, 283, -1, 78,
79999999999999, 49999989, -1, 9988, 4989, -1, 484, 192, -1, 79,
89999999999999, 9999998, -1, 8987, 995, -1, 587, 389, -1, 80,
99999999999999, 59999989, 79997, 6996, 2986, 785, 393, 388, 91, 81,
199999999999999, 19999998, -1, 29989, 3987, -1, 586, 387, -1, 82,
299999999999999, 69999989, -1, 19988, 4988, -1, 689, 386, -1, 83,
399999999999999, 29999998, 89997, 9987, 5989, 694, 585, 385, -1, 84,
499999999999999, 79999989, -1, 7996, 1995, -1, 688, 384, -1, 85,
599999999999999, 39999998, -1, 39989, 3986, -1, 584, 383, -1, 86,
699999999999999, 89999989, 99997, 29988, 4987, 885, 687, 292, -1, 87,
799999999999999, 49999998, -1, 19987, 5988, -1, 493, 489, -1, 88,
899999999999999, 99999989, -1, 8996, 6989, -1, 686, 488, -1, 89,
999999999999999, 59999998, 199997, 49989, 2995, 794, 789, 487, 191, 90,
1999999999999999, 199999989, -1, 39988, 4986, -1, 685, 486, -1, 181,
2999999999999999, 69999998, -1, 29987, 5987, -1, 788, 485, -1, 182,
3999999999999999, 299999989, 299997, 9996, 6988, 985, 684, 484, -1, 183,
4999999999999999, 79999998, -1, 59989, 7989, -1, 787, 483, -1, 184,
5999999999999999, 399999989, -1, 49988, 3995, -1, 593, 392, -1, 185,
6999999999999999, 89999998, 399997, 39987, 5986, 894, 786, 589, -1, 186,
7999999999999999, 499999989, -1, 19996, 6987, -1, 889, 588, -1, 187,
8999999999999999, 99999998, -1, 69989, 7988, -1, 785, 587, -1, 188,
9999999999999999, 599999989, 499997, 59988, 8989, 1985, 888, 586, 291, 189,
19999999999999999, 199999998, -1, 49987, 4995, -1, 784, 585, -1, 190,
29999999999999999, 699999989, -1, 29996, 6986, -1, 887, 584, -1, 281,
39999999999999999, 299999998, 599997, 79989, 7987, 994, 693, 583, -1, 282,
49999999999999999, 799999989, -1, 69988, 8988, -1, 886, 492, -1, 283,
59999999999999999, 399999998, -1, 59987, 9989, -1, 989, 689, -1, 284,
69999999999999999, 899999989, 699997, 39996, 5995, 2985, 885, 688, -1, 285
};

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int _ = read();
    while(_--) {
        int n = read(), k = read();
        printf("%lld\n", ans[n][k]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45483201/article/details/106972095