AcWing第15场周赛题解

A. 3826. 青蛙跳

题目链接:https://www.acwing.com/problem/content/3829/

题目大意:略。

解题思路:简单数学题。

示例程序:

#include <bits/stdc++.h>
using namespace std;

int T;
long long a, b, k;

int main() {
    cin >> T;
    while (T--) {
        cin >> a >> b >> k;
        cout << (k+1)/2 * a - k/2*b << endl;
    }
    return 0;
}

B. 3827. 最小正整数

题目链接:https://www.acwing.com/problem/content/3830/

题目大意:略。

解题思路:设 nn 整除去最多 k 个因子 2,同时整除去最多 k 个因子 5 的结果。则答案为 n×10k

示例程序:

#include <bits/stdc++.h>
using namespace std;

int T, n, k;

int main() {
    cin >> T;
    while (T--) {
        cin >> n >> k;
        for (int i = 0; i < k && n%2==0; i++, n/=2);
        for (int i = 0; i < k && n%5==0; i++, n/=5);
        cout << n;
        for (int i = 0; i < k; i++) cout << 0;
        cout << endl;
    }
    return 0;
}

C. 3828. 行走路径

题目链接:https://www.acwing.com/problem/content/3831/

题目大意:搜索。第一轮搜索判环,第二轮搜索求最大轮次。

解题思路:判断+搜索。这题和第13场周赛的第3题非常相似。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;

int _n, _m, n;
char s[maxn][maxn];
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};

bool in_map(int x, int y) {
    return x >= 0 && x < _n && y >= 0 && y < _m;
}

int getid(int x, int y) {
    return x * _m + y + 1;
}

bool cango(char a, char b) {
    return a=='Q' && b=='W' || a=='W' && b=='E' || a=='E' && b=='R' || a=='R' && b=='Q';
}

vector<int> g[maxn*maxn], r[maxn*maxn];
int in[maxn*maxn], out[maxn*maxn], cnt, f[maxn*maxn];
bool vis[maxn*maxn];
queue<int> que;

void initg() {
    scanf("%d%d", &_n, &_m);
    for (int i = 0; i < _n; i++) scanf("%s", s[i]);
    n = _n * _m;
    for (int i = 0; i < _n; i++) {
        for (int j = 0; j < _m; j++) {
            int u = getid(i, j);
            for (int k = 0; k < 4; k++) {
                int x = i + dir[k][0], y = j + dir[k][1];
                int v = getid(x, y);
                if (in_map(x, y) && cango(s[i][j], s[x][y])) {
                    g[u].push_back(v);
                    r[v].push_back(u);
                    out[u]++;
                    in[v]++;
                }
            }
        }
    }
}

int dfs(int u) {
    if (f[u]) return f[u];
    f[u] = 1;
    for (auto v : g[u])
        f[u] = max(f[u], dfs(v)+1);
    return f[u];
}


int main() {
    initg();
    // 判断是否存在环
    for (int i = 1; i <= n; i++) {
        if (!in[i] || !out[i]) {
            vis[i] = true;
            cnt++;
            que.push(i);
        }
    }
    while (!que.empty()) {
        int u = que.front();
        que.pop();
        if (!in[u]) {
            for (auto v : g[u]) {
                in[v]--;
                if (!in[v] && !vis[v]) {
                    vis[v] = true;
                    cnt++;
                    que.push(v);
                }
            }
        }
        else {
            for (auto v : r[u]) {
                out[v]--;
                if (!out[v] && !vis[v]) {
                    vis[v] = true;
                    cnt++;
                    que.push(v);
                }
            }
        }
    }
    if (cnt < n) {  // 存在环
        puts("infinity");
        return 0;
    }
    int ans = 0;
    for (int i = 1; i <= n; i++)
        if (s[(i-1)/_m][(i-1)%_m] == 'Q')
            ans = max(ans, dfs(i));
    ans /= 4;
    if (!ans) puts("none");
    else printf("%d\n", ans);
}
posted @   quanjun  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示