题目链接:https://ac.nowcoder.com/acm/contest/6909#question
题意为求满足 n n ∗ k + i > = a [ i ] nn*k + i >= a[i] nn∗k+i>=a[i] 的最小的 i + 1 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;
}
};
每次先算出胜利的场次,再算出平局的场次,最后剩下的数目就是失败的场次
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;
}
};
动态规划变形,中间有一块区域不能走,进行状态转移时另外判断一下即可
注意这道题里面的行和列是反过来的,然后再注意一下初始条件
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];
}
};