牛客编程巅峰赛S1第10场 - 黄金&钻石

题目链接:https://ac.nowcoder.com/acm/contest/6909#question

第一次AK纪念
在这里插入图片描述

A 牛牛排队

题意为求满足 n n k + i > = a [ i ] nn*k + i >= a[i] 的最小的 i + 1 i+1

class Solution {
public:
    /**
     * 返回牛牛最终是从第几个门进入食堂吃饭的
     * @param n int整型 代表门的数量
     * @param a int整型vector 代表每个门外等待的人数
     * @return int整型
     */
    int solve(int n, vector<int>& a) {
        // write code here
        int minv = 0x3f3f3f3f, k;
        for (int i = 0; i < n; i++) {
            int num = a[i] - i, nn;
            if (num < 0) 
                num = 0;
            if (num % n == 0) {
                nn = num / n;
            } else {
                nn = num / n + 1;
            }
            if (minv > nn) {
                minv = nn;
                k = i + 1;
            }
        }
        return k;
    }
};

B 石头、剪刀、布

每次先算出胜利的场次,再算出平局的场次,最后剩下的数目就是失败的场次

class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @param p1 int整型 
     * @param q1 int整型 
     * @param m1 int整型 
     * @param p2 int整型 
     * @param q2 int整型 
     * @param m2 int整型 
     * @return int整型
     */
    int Highestscore(int n, int p1, int q1, int m1, int p2, int q2, int m2) {
        // write code here
        int res = 0, minv;
        // 胜利的场次
        minv = min(p1, q2);
        res += minv;
        p1 -= minv; q2 -= minv;
        
        minv = min(q1, m2);
        res += minv;
        q1 -= minv; m2 -= minv;
        
        minv = min(m1, p2);
        res += minv;
        m1 -= minv; p2 -= minv;
        // 平局的场次
        minv = min(p1, p2);
        p1 -= minv; p2 -= minv;
        
        minv = min(q1, q2);
        q1 -= minv; q2 -= minv;
        
        minv = min(m1, m2);
        m1 -= minv; m2 -= minv;
        // 失败的场次
        res -= p1 + q1 + m1;
        
        return res;
    }
};

C 寻宝

动态规划变形,中间有一块区域不能走,进行状态转移时另外判断一下即可

注意这道题里面的行和列是反过来的,然后再注意一下初始条件

class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @param m int整型 
     * @param x0 int整型 
     * @param y0 int整型 
     * @param x1 int整型 
     * @param y1 int整型 
     * @return int整型
     */
    int M = 1e9 + 7;
    bool judge(int x, int y, int x0, int y0, int x1, int y1) {
        if (x >= x0 && y >= y0 && x <= x1 && y <= y1) {
            return 0;
        } else {
            return 1;
        }
    }
    long long dp[1005][1005];
    int GetNumberOfPath(int n, int m, int x0, int y0, int x1, int y1) {
        // write code here
        swap(x0, y0); swap(x1, y1);
        // 注意初始条件
        dp[1][1] = 1;
        for (int i = 2; i <= n; i++) {
            if (judge(1, i, x0, y0, x1, y1)) {
                dp[1][i] = dp[1][i - 1];
            } else {
                dp[1][i] = 0;
            }
        }
        for (int i = 2; i <= m; i++) {
            if (judge(i, 1, x0, y0, x1, y1)) {
                dp[i][1] = dp[i - 1][1];
            } else {
                dp[i][1] = 0;
            }
        }
        for (int i = 2; i <= m; i++) {
            for (int j = 2; j <= n; j++) {
                if (judge(i, j, x0, y0, x1, y1)) {
                    dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % M;
                } else {
                    dp[i][j] = 0;
                }
            }
        }
        return dp[m][n];
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43772166/article/details/107886864