牛牛排队

题意:一个圆上有n个点,这n个点开始都站着一些人,然后牛牛绕这n个点走,每分钟到达下一个点,每分钟每个点会少一个人,问最后牛牛会停在那个当前没有人的点。
思路:我们会发现,对于每个点,牛牛到达这个点时人数的减少是呈周期性变化的,即假设总共有n个门口的话,牛牛现在是第m次到达这个某个门口i的话,那么此时这个门口i的人数的减少就是nk+i;我们只要对每个门口的人数进行处理,看牛牛第几次来到这个门口的时候这个门口的人数会为0就行了,我们把次数存到b数组里面,最后找出b数组里面最小的那个数第一次出现的下标即可。
代码:

class Solution {
public:
    /**
     * 返回牛牛最终是从第几个门进入食堂吃饭的
     * @param n int整型 代表门的数量
     * @param a int整型vector 代表每个门外等待的人数
     * @return int整型
     */
     typedef long long ll;
     int b[100010];
    int solve(int n, vector<int>& a) {
        // write code here
        memset(b,0,sizeof(b));
        for(int i=0;i<n;i++){
            ll sum=i;
            while(sum<a[i]){
                b[i]++;
                sum+=n;
            }
        }
        int mi=1e9+7;
        for(int i=0;i<n;i++){
            mi=min(mi,b[i]);
        }
        for(int i=0;i<n;i++){
            if(b[i]==mi){
                return i+1;
            }
        }
    }
};

石头、剪刀、布II

题意:略
思路:贪心。要想让牛牛胜利的回合最多的话,我们需要就要尽可能让牛妹出剪刀的时候牛牛出石头,牛妹出布的时候牛牛出剪刀,牛妹出石头的时候牛牛出布。同时还要记得更新它们俩的牌的情况。然后,此时牛牛已经把所有能让自己加分的情况都用完了,接下来就只有平局和输的情况了。平局的情况有点复杂,而且对牛牛的分数变化也没有影响。所以我们只要考虑牛妹能赢的情况。其实就是和我们考虑牛牛能赢的情况是一样的。
代码:

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 ans=0;
        int a=min(p1,q2);
        ans+=a;
        p1-=a,q2-=a;
        a=min(q1,m2);
        ans+=a;
        q1-=a,m2-=a;
        a=min(m1,p2);
        ans+=a;
        m1-=a,p2-=a;
        ans=ans-min(p2,q1)-min(q2,m1)-min(m2,p1);
        return ans;
    }
};

寻宝

思路:一个十分十分简单的dp题,可惜我题目都没看。。。我们用dp[i][j]来表示到达当前的位置时有的路径条数。我们对于陷阱区域,只需要保持这里的dp值为0即可,然后进行状态的转移dp[i][j]=dp[i-1][j]+dp[i][j-1],同时注意取模即可。
代码:

class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @param m int整型 
     * @param x0 int整型 
     * @param y0 int整型 
     * @param x1 int整型 
     * @param y1 int整型 
     * @return int整型
     */
     const int mod=1e9+7;
     typedef long long ll;
     ll dp[1010][1010];
    int GetNumberOfPath(int n, int m, int x0, int y0, int x1, int y1) {
        // write code here
        memset(dp,0,sizeof(dp));
        dp[1][1]=1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(i==1&&j==1)  continue;
                if(i<=x1&&i>=x0&&j<=y1&&j>=y0)  continue;
                else  dp[i][j]=(dp[i-1][j]+dp[i][j-1])%mod;
            }
        }
        return dp[n][m]%mod;
    }
};