能力全面提升综合题单

Part2 基础算法

模拟

点击查看代码
int n;
struct Node{
    int a, b, g, k;
}node[N];

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        cin >> node[i].a >> node[i].b >> 
        node[i].g >> node[i].k;
    }
    int x, y; cin >> x >> y;
    int ans;
    for (int i = 1; i <= n; i ++) {
        int a = node[i].a, b = node[i].b,
        g = node[i].g, k = node[i].k;
        if (x >= a && x <= a + g && y >= b && y <= b + k)
            ans = i;
    }
    cout << ans << endl;
}
点击查看代码
int n;

void solve() {
    cin >> n;
    if (n == 0) {
        printf("1");
        return ;
    }
    for (int i = n; i >= 0; i --) {
        int num; cin >> num;
        if (i == n) {
            if (num == 0) continue;
            if (num > 0) {
                if (num == 1) printf("x^%d", i);
                else printf("%dx^%d", num, i);
            } else {
                if (num == -1) printf("-x^%d", i);
                else printf("%dx^%d", num, i);
            }
        }
        else if (i == 0) {
            if (num == 0) continue;
            if (num > 0) {
                printf("+%d", num);
            } else {
                printf("%d", num);
            }
        }
        else if (i == 1) {
            if (num == 0) continue;
            if (num > 0) {
                if (num == 1) printf("+x");
                else printf("+%dx", num);
            } else {
                if (num == -1) printf("-x");
                else printf("%dx", num);
            }
        }
        else {
            if (num == 0) continue;
            if (num > 0) {
                if (num == 1) printf("+x^%d", i);
                else printf("+%dx^%d", num, i);
            } else {
                if (num == -1) printf("-x^%d", i);
                else printf("%dx^%d", num, i);
            }
        }

    }
}
点击查看代码
int n, na, nb;
int a[N], b[N];

int check(int x, int y) {
    if (x == 0) {
        if (y == 0) return 1;
        else if (y == 1 || y == 4) return 2;
        else return 3;
    } else if (x == 1) {
        if (y == 1) return 1;
        else if (y == 2 || y == 4) return 2;
        else return 3;
    } else if (x == 2) {
        if (y == 2) return 1;
        else if (y == 3) return 2;
        else return 3;
    } else if (x == 3) {
        if (y == 3) return 1;
        else return 3;
    } else {
        return 1;
    }
}

void solve() {
    cin >> n >> na >> nb;
    for (int i = 0; i < na; i ++)
        cin >> a[i];
    for (int i = 0; i < nb; i ++)
        cin >> b[i];
    int ans1 = 0, ans2 = 0;
    for (int i = 0; i < n; i ++) {
        int x = a[i % na],
            y = b[i % nb];
        bool fl = false;
        if (x > y) {
            swap(x, y);
            fl = true;
        }
        if (check(x, y) == 2) {
            if (!fl) ans2 ++;
            else ans1 ++;
        }
        else if (check(x, y) == 3) {
            if (!fl) ans1 ++;
            else ans2 ++;
        } 
        //cout << ans1 << ' ' << ans2 << endl;
    }
    // 0 1 2 3 4 0 1 2 3 4
    // 0 3 4 2 1 0 0 3 4 2
    cout << ans1 << ' ' << ans2 << endl;
}
点击查看代码
struct Node{
    int st;
    string name;
}node[N];

int n, m;
int a[N], b[N];

void solve() {
    cin >> n >> m;
    for (int i = 0; i < n; i ++)
        cin >> node[i].st >> node[i].name;
    int nw = 0;
    while (m --) {
        int x, y;
        cin >> x >> y;
        int st = node[nw].st;
        if (x == 0) {
            if (st == 0) {
                nw = (nw - y + n) % n;
            } else {
                nw = (nw + y) % n;
            }   
        } else {
            if (st == 0) {
                nw = (nw + y) % n;
            } else {
                nw = (nw - y + n) % n;
            }
        }
    }
    cout << node[nw].name << endl;
}

二分答案

点击查看代码
double a, b, c, d;

double f(double x) {
    return a * x * x * x + b * x * x + c * x + d;   
}

void solve () {
    cin >> a >> b >> c >> d;
    for (int i = -100; i <= 99; i ++) {
        double l = i, r = i + 1;
        if (f(l) == 0) {
            printf("%.2lf ", l);
            continue;
        }
        if (f(l) * f(r) < 0) {
            for (int j = 1; j <= 60; j ++) {
                double mid = (l + r) / 2;
                if (f(mid) * f(l) <= 0) r = mid;
                else l = mid;
            }
            printf("%.2lf ", l);
        }
    }
    return ;
}
点击查看代码
int n, m, L;
int a[N];

bool check(int x) {
    int cn = 0;
    int i = 0, j = 1;
    while (j <= n + 1) {
        int l = a[i], r = a[j];
        if (r - l < x) {
            j ++;
            cn ++;
        } else {
            i = j;
            j ++;
        }
    }
    return cn <= m;
}

void solve () {
    cin >> L >> n >> m;
    a[0] = 0;
    a[n + 1] = L;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    int l = 1, r = L + 1;
    while (l < r) {
        int mid = (l + r + 1) / 2;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    cout << l << endl;
    return ;
}
点击查看代码
bool bfs(int sx, int sy, int mx) {
    queue<PII> q;
    mem0(vis);
    q.push({sx, sy});
    vis[sx][sy] = true;
    int cn = 0;
    while (q.size()) {
        PII pi = q.front();
        q.pop();
        int x = pi.fi, y = pi.sc;
        for (int i = 0; i < 4; i ++) {
            int xx = x + dx[i], yy = y + dy[i];
            if (xx >= 1 && xx <= n && yy >= 1 && yy <= m
                && a[xx][yy] <= mx && !vis[xx][yy]) {
                q.push({xx, yy});
                vis[xx][yy] = true;
                if (xx == n) cn ++;
            }
        }
    }
    return cn == m;
}

bool check(int x) {
    bool fl = false;
    if ((bfs(1, 1, x)))
        fl = true;
    return fl;
}

void solve () {
    cin >> n >> m;
        
    for (int i = 1; i <= n; i ++) {
        for (int j = 1; j <= m; j ++) 
            cin >> a[i][j];
    }

    int l = 1, r = 1000 + 1;
    while (l < r) {
        int mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << l << endl;
    return ;
}
点击查看代码
ll n, m, s, ans = 0x3f3f3f3f3f3f3f3f, res;
PLL a[N], b[N];
ll sw[N], sv[N];

bool check(ll x) {
    for (int i = 1; i <= n; i ++) {
        if (a[i].fi >= x) 
            sw[i] = sw[i - 1] + 1, sv[i] = sv[i - 1] + a[i].sc;
        else 
            sw[i] = sw[i - 1], sv[i] = sv[i - 1]; 
    }
    ll nw = 0;
    for (int i = 1; i <= m; i ++)
        nw += (sw[b[i].sc] - sw[b[i].fi - 1]) * (sv[b[i].sc] - sv[b[i].fi - 1]);
    res = llabs(nw - s);
    if (nw - s < 0) return false;
    else return true;
}

void solve () {
    cin >> n >> m >> s;
    for (int i = 1; i <= n; i ++) cin >> a[i].fi >> a[i].sc;
    for (int i = 1; i <= m; i ++) cin >> b[i].fi >> b[i].sc;
    ll l = 0, r = 1e6 + 1;
    while (l < r) {
        ll mid = (l + r + 1) / 2;
        if (check(mid)) l = mid;
        else r = mid - 1;
        if (res < ans) ans = res;
    }
    cout << ans << endl;
    return ;
}
点击查看代码
int n, m;
int a[N], d[N], s[N], t[N];
int c[N], ne[N];

bool check(int x) {
    for (int i = 1; i <= n; i ++) {
        ne[i] = ne[i - 1] + c[i];
        if (ne[i] > a[i]) {
            return false;
        }
    }
    return true;
}

void solve () {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i <= m; i ++) {
        cin >> d[i] >> s[i] >> t[i];
        c[s[i]] += d[i];
        c[t[i] + 1] -= d[i];
    }
    if (check(m)) {
        cout << 0 << endl;
        return ;
    }
    int l = 1, r = m;
    while (l < r) {
        int mid = (l + r) / 2;
        if (check(mid)) l = mid + 1;
        else r = mid;
    }
    cout << -1 << endl << l << endl;
    return ;
}
点击查看代码
int n, m;
ll a[N], lo[N];

ll check(ll x) {
    ll nw = 0, cn = 0;
    for (int i = 1; i <= n; i ++) {
        if (lo[i] >= 0) {
            nw += lo[i];
            if (nw >= x) {
                cn ++;
                nw = 0;
            }
        } else {
            nw += lo[i];
            if (nw < 0) nw = 0;
        }
    }
    return cn;
}

void solve () {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) 
        cin >> lo[i];
    ll l = 1, r = 1e18;
    while (l < r) {
        ll mid = (l + r) / 2;
        if (check(mid) > m) l = mid + 1;
        else if (check(mid) <= m) r = mid;
    }
    if (check(l) != m) {
        cout << -1 << endl;
        return ;
    }
    cout << l << ' ';
    r = 1e18;
    while (l < r) {
        ll mid = (l + r) / 2;
        if (check(mid) >= m) l = mid + 1;
        else r = mid;
    }
    cout << l - 1 << endl;
    return ;
}
posted @ 2024-03-13 21:24  ComistryMo  阅读(23)  评论(0)    收藏  举报