题目链接
解题思路:
解题代码:
class Solution {
public:
int distributeCandies(int n, int limit) {
int ans = 0;
for(int i = 0; i <= limit; i++)
{
for(int j = 0; j <= limit; j++)
{
for(int k = 0; k <= limit; k++)
{
if(i + j + k == n)
ans += 1;
}
}
}
return ans;
}
};
class Solution {
public:
int distributeCandies(int n, int limit) {
int ans = 0;
for(int i = 0; i <= limit; i++)
{
for(int j = 0; j <= limit; j++)
{
int k = n - i - j;
if(k >= 0 && k <= limit)
ans += 1;
}
}
return ans;
}
};
题目链接
解题思路1:
解题代码:
class Solution {
public:
long long distributeCandies(int n, int limit) {
long long ans = 0;
for(int a = 0; a <= limit; a++)
ans += max(0, min(n-a, limit) - max(0, n-limit-a) + 1);
return ans;
}
};
解题思路2:
解题代码:
class Solution {
public:
long long distributeCandies(int n, int limit) {
long long ans = 0;
auto func = [&](long long num) -> long long
{
if(num < 0)
return 0;
return num * (num - 1) / 2;
};
return func(n+2) - 3 * func(n - (limit + 1) + 2) + 3 * func(n - 2 * (limit + 1) + 2) - func(n - 3 * (limit + 1) + 2);
}
};
题目链接
解题思路:
解题代码:
class Solution {
public:
int stringCount(int n) {
if(n < 4)
return 0;
const int MOD = 1e9+7;
long long f[n][2][3][2];
memset(f, -1, sizeof(f));
function dfs = [&](int i, int lcnt, int ecnt, int tcnt) -> long long
{
if(i < 0)
return lcnt == 0 && ecnt == 0 && tcnt == 0 ? 1 : 0;
if(f[i][lcnt][ecnt][tcnt] != -1)
return f[i][lcnt][ecnt][tcnt];
long long &ans = f[i][lcnt][ecnt][tcnt];
ans = 0;
//随便选
ans = (ans + 23 * dfs(i-1, lcnt, ecnt, tcnt)) % MOD;
//作为leet中的一个字符来选
ans = (ans + dfs(i-1, 0, ecnt, tcnt)) % MOD;
ans = (ans + dfs(i-1, lcnt, max(ecnt-1, 0), tcnt)) % MOD;
ans = (ans + dfs(i-1, lcnt, ecnt, 0)) % MOD;
return ans;
};
return dfs(n-1, 1, 2, 1);
}
};
解题思路2:
同样可以使用容斥原理
总共有26 ^ n个字符串,减去不含leet的字符串个数
不含leet的字符串需要至少满足下面三个条件中的一个:
至少满足一个条件:
至少满足两个条件:
满足三个条件:23^n + n * 23^(n-1)
最终答案 = 总方案数 - 至少满足一个条件 + 至少满足两个条件 - 满足三个条件
用快速幂计算幂
解题代码:
class Solution {
public:
const int MOD = 1e9+7;
long long myPow(int a, int n)
{
if(n == 0)
return 1;
if(n & 1)
return (a * myPow(a, n-1)) % MOD;
long long temp = myPow(a, n/2);
return (temp * temp) % MOD;
}
int stringCount(int n) {
return ((myPow(26, n) -
(myPow(25, n) * 3 + n * myPow(25, n-1)) +
(myPow(24, n) * 3 + 2 * n * myPow(24, n-1)) -
(myPow(23, n) + n * myPow(23, n-1))) % MOD + MOD) % MOD;
}
};
class Solution {
public:
long long maxSpending(vector>& values) {
//最大开销
long long ans = 0;
priority_queue, vector>, greater<>> pq;
int m = values.size();
int n = values[0].size();
for(int i = 0; i < m; i++)
pq.push({values[i][n-1], i * n + n-1});
long long d = 1;
while(!pq.empty())
{
auto [val, idx] = pq.top();
pq.pop();
ans += val * d;
int x = idx / n;
int y = idx % n;
if(y != 0)
pq.push({values[x][y-1], idx-1});
d += 1;
}
return ans;
}
};