跳转至

OJ 1-1题解

Equation

参考代码:

#include <bits/stdc++.h>
#define eps 1e-8
#define ll long long
using namespace std;
int main()
{
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    ll delta = (ll)b * b - 4 * (ll)a * c;
    if (delta > 0) {
        printf("2\n");
        double xa = (double)(-b + sqrt((double)delta)) / (2 * a);
        double xb = (double)(-b - sqrt((double)delta)) / (2 * a);
        printf("%.3lf %.3lf\n", xa, xb);
    }
    else if (delta == 0) {
        double x = (double)(-b) / (2 * a);
        printf("1\n");
        printf("%.3lf\n", x);
    }
    else printf("0\n");
    return 0;
}

注意:include <bits/stdc++.h>为万能头文件,其中包括了大多 OJ 题中需要使用的 c++ 头文件,可以参考使用;

scanf%d之间是否要有空格视代码习惯而定,可有可没有;

printf%.3lf表示保留三位小数,推荐用这种方法保留小数,比较简洁;

#define ll long longtypedef long long ll;等价,在如此声明之后,接下来的代码中就可以用ll代替long long使用,更加便捷(没有推销自己的意思)。

Coin

参考代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    printf("%d", 25 * a + 10 * b + 5 * c);
    return 0;
}

Load

参考代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n, T, W;
ll ans, tot, used;
int main()
{
    scanf("%d %d %d", &n, &T, &W);
    tot = W;
    int t, w, v;
    for (int i = 1; i <= n; i++) {
        scanf("%d %d %d", &t, &w, &v);
        tot = (ll)(1 + t / T) * W;
        if ((ll)w <= tot - used) {
            used += (ll)w;
            ans += (ll)w * v;
        }
        else {
            ans += (tot - used) * (ll)v;
            used = tot;
        }
    }
    printf("%lld", ans);
    return 0;
}

注意,t / T中两个 int 类型整数相除默认向下取整。

本题不需要使用数组。

Date

#include <cstdio>
#include <cassert>
int T;
int month_days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int targetM, targetD;
bool targetFlag;

#ifndef NDEBUG
#define printd(...) fprintf(stderr, __VA_ARGS__)

#else
#define printd(...) 0

#endif

bool is_workday(int m, int d, int k) {
    if (m == 1 && d == 1)
        return false;
    if (m == 5 && d == 1)
        return false;
    if (m == 10 && d == 1)
        return false;
    if (!k || k == 6)
        return false;
    return true;
}

bool legal(int m, int d, int k) {
    if (m >= 1 && m <= 12)
        return true;
    if (d >= 1 && d <= month_days[m])
        return true;
    if (k >= 0 && k <= 6)
        return true;
    printd("Ilegal m = %d, d = %d, k = %d\n", m, d, k);
    return false;
}

void next_day(int &m, int &d, int &k) {
    if (m == targetM && d == targetD) {
        targetFlag = true;
    }
    assert(legal(m, d, k));
    d++;
    if (d > month_days[m]) {
        m++;
        if (m > 12) {
            m = 1;
        }
        d = 1;
    }
    k = (k + 1) % 7;
    return;
}

void next_workday(int &m, int &d, int &k) {
    next_day(m, d, k);
    while (!is_workday(m, d, k)) {
        next_day(m, d, k);
    }
    return;
}

void next_wed(int &m, int &d, int &k) {
    next_workday(m, d, k);
    while (k != 3) {
        next_workday(m, d, k);
    }
    return;
}

int main() {
    scanf("%d", &T);
    while (T--) {
        int x, y, z;
        int M, D, K, m, d;

        scanf("%d %d %d", &x, &y, &z);
        scanf("%d-%d %d", &M, &D, &K);
        scanf("%d-%d", &m, &d);

        int countdown[3] = { x, y, z };
        targetM = m, targetD = d;
        targetFlag = false;

        assert(legal(M, D, K));
        assert(legal(m, d, 0));
        assert(is_workday(M, D, K));

        int nowM = M, nowD = D, nowK = K, phase = 0;
        while (true) {
            while (countdown[phase] == 0 && phase != 3) {
                phase++;
                if (phase != 3 && nowK != 3)
                    next_wed(nowM, nowD, nowK);
                printd("phase %d: %d %d %d\n", phase, nowM, nowD, nowK);
            }
            if (phase == 3 || targetFlag)
                break;
            countdown[phase]--;
            next_workday(nowM, nowD, nowK);
        }
        printd("%d %d %d\n", nowM, nowD, nowK);

        puts(targetFlag ? "failure" : "success");
    }
    return 0;
}