牛牛排队
题意:一个圆上有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; } };