牛牛排队
题意:一个圆上有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;
}
};
京公网安备 11010502036488号