周赛276
This commit is contained in:
parent
7e97bc3a2e
commit
e3ade14e2b
81
src/main/java/contest/y2022/m1/week/Solution276.java
Normal file
81
src/main/java/contest/y2022/m1/week/Solution276.java
Normal file
@ -0,0 +1,81 @@
|
||||
package contest.y2022.m1.week;
|
||||
|
||||
import com.code.leet.entiy.TwoArray;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @description:
|
||||
* @author: Administrator
|
||||
* @date: 2021/8/22-10:29
|
||||
*/
|
||||
public class Solution276 {
|
||||
public static void main(String[] args) {
|
||||
Solution276 solution = new Solution276();
|
||||
// solution.divideString("abcdefghij", 3, 'x');
|
||||
TwoArray twoArray = new TwoArray("[[3,2],[4,3],[4,4],[2,5]]", true);
|
||||
System.out.println(solution.mostPoints(twoArray.getArr()));
|
||||
}
|
||||
|
||||
public String[] divideString(String s, int k, char fill) {
|
||||
char[] chs = s.toCharArray();
|
||||
int length = s.length() % k == 0 ? s.length() / k : s.length() / k + 1;
|
||||
String[] strs = new String[length];
|
||||
Arrays.fill(strs, "");
|
||||
int index = 0;
|
||||
for (char ch : chs) {
|
||||
if (strs[index].length() == k) {
|
||||
index++;
|
||||
}
|
||||
strs[index] += ch;
|
||||
}
|
||||
for (int i = strs[index].length(); i < k; i++) {
|
||||
strs[index] += fill;
|
||||
}
|
||||
return strs;
|
||||
}
|
||||
|
||||
public int minMoves(int target, int maxDoubles) {
|
||||
int count = 0;
|
||||
while (target > 1) {
|
||||
if (maxDoubles == 0) {
|
||||
break;
|
||||
}
|
||||
if (target % 2 == 0) {
|
||||
target /= 2;
|
||||
maxDoubles--;
|
||||
} else {
|
||||
target--;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return target == 1 ? count : count + target - 1;
|
||||
}
|
||||
|
||||
public long mostPoints(int[][] questions) {
|
||||
Map<Integer, Integer> map = new HashMap<>();
|
||||
long[][] nums = new long[questions.length][2];
|
||||
long max = 0;
|
||||
for (int i = 0; i < questions.length; i++) {
|
||||
if (i > 0) {
|
||||
nums[i][0] = Math.max(nums[i][0], nums[i - 1][0]);
|
||||
}
|
||||
nums[i][1] = nums[i][0] + questions[i][0];
|
||||
if (i + questions[i][1] + 1 < questions.length) {
|
||||
nums[i + questions[i][1] + 1][0] = Math.max(nums[i + questions[i][1] + 1][0], nums[i][1]);
|
||||
}
|
||||
max = Math.max(nums[i][1], max);
|
||||
}
|
||||
return max;
|
||||
}
|
||||
|
||||
public long maxRunTime(int n, int[] batteries) {
|
||||
long sum = 0;
|
||||
long min = 0;
|
||||
for (int battery : batteries) {
|
||||
sum += battery;
|
||||
min = Math.min(min, battery);
|
||||
}
|
||||
return batteries.length == n ? min : sum / n;
|
||||
}
|
||||
}
|
@ -0,0 +1,283 @@
|
||||
#### 方法一:暴力计算
|
||||
|
||||
记当前的天数是第 $\textit{week}$ 周的第 $\textit{day}$ 天。我们从第一周的星期一开始存钱,记 $\textit{week} = 1$,$\textit{day} = 1$。一周内,每一天比前一天多存 $1$ 块钱。而每个周一,会比前一个周一多存 $1$ 块钱。因此,每天存的钱等于 $\textit{week} + \textit{day} - 1$。把每天存的钱相加就可以得到答案。
|
||||
|
||||
* [sol1-Python3]
|
||||
|
||||
```Python
|
||||
class Solution:
|
||||
def totalMoney(self, n: int) -> int:
|
||||
week, day = 1, 1
|
||||
res = 0
|
||||
for i in range(n):
|
||||
res += week + day - 1
|
||||
day += 1
|
||||
if day == 8:
|
||||
day = 1
|
||||
week += 1
|
||||
return res
|
||||
```
|
||||
|
||||
* [sol1-Java]
|
||||
|
||||
```Java
|
||||
class Solution {
|
||||
public int totalMoney(int n) {
|
||||
int week = 1, day = 1;
|
||||
int res = 0;
|
||||
for (int i = 0; i < n; ++i) {
|
||||
res += week + day - 1;
|
||||
++day;
|
||||
if (day == 8) {
|
||||
day = 1;
|
||||
++week;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
* [sol1-C#]
|
||||
|
||||
```C#
|
||||
public class Solution {
|
||||
public int TotalMoney(int n) {
|
||||
int week = 1, day = 1;
|
||||
int res = 0;
|
||||
for (int i = 0; i < n; ++i) {
|
||||
res += week + day - 1;
|
||||
++day;
|
||||
if (day == 8) {
|
||||
day = 1;
|
||||
++week;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
* [sol1-C++]
|
||||
|
||||
```C++
|
||||
class Solution {
|
||||
public:
|
||||
int totalMoney(int n) {
|
||||
int week = 1, day = 1;
|
||||
int res = 0;
|
||||
for (int i = 0; i < n; ++i) {
|
||||
res += week + day - 1;
|
||||
++day;
|
||||
if (day == 8) {
|
||||
day = 1;
|
||||
++week;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
* [sol1-C]
|
||||
|
||||
```C
|
||||
int totalMoney(int n){
|
||||
int week = 1, day = 1;
|
||||
int res = 0;
|
||||
for (int i = 0; i < n; ++i) {
|
||||
res += week + day - 1;
|
||||
++day;
|
||||
if (day == 8) {
|
||||
day = 1;
|
||||
++week;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
```
|
||||
|
||||
* [sol1-Golang]
|
||||
|
||||
```go
|
||||
func totalMoney(n int) (ans int) {
|
||||
week, day := 1, 1
|
||||
for i := 0; i < n; i++ {
|
||||
ans += week + day - 1
|
||||
day++
|
||||
if day == 8 {
|
||||
day = 1
|
||||
week++
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
* [sol1-JavaScript]
|
||||
|
||||
```JavaScript
|
||||
var totalMoney = function(n) {
|
||||
let week = 1, day = 1;
|
||||
let res = 0;
|
||||
for (let i = 0; i < n; ++i) {
|
||||
res += week + day - 1;
|
||||
++day;
|
||||
if (day === 8) {
|
||||
day = 1;
|
||||
++week;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
};
|
||||
```
|
||||
|
||||
**复杂度分析**
|
||||
|
||||
- 时间复杂度:$O(n)$。需要遍历一次 $n$ 得到答案。
|
||||
|
||||
- 空间复杂度:$O(1)$。只需要用到常数空间。
|
||||
|
||||
#### 方法二:等差数列求和进行优化
|
||||
|
||||
因为每周七天存的钱之和比上一周多 $7$ 块,因此每周存的钱之和的序列是一个等差数列,我们可以用等差数列求和公式来求出所有完整的周存的钱总和。剩下的天数里,每天存的钱也是一个等差数列,可以用相同的公式进行求和。最后把两者相加可以得到答案。
|
||||
|
||||
* [sol2-Python3]
|
||||
|
||||
```Python
|
||||
class Solution:
|
||||
def totalMoney(self, n: int) -> int:
|
||||
# 所有完整的周存的钱
|
||||
weekNumber = n // 7
|
||||
firstWeekMoney = (1 + 7) * 7 // 2
|
||||
lastWeekMoney = firstWeekMoney + 7 * (weekNumber - 1)
|
||||
weekMoney = (firstWeekMoney + lastWeekMoney) * weekNumber // 2
|
||||
# 剩下的不能构成一个完整的周的天数里存的钱
|
||||
dayNumber = n % 7
|
||||
firstDayMoney = 1 + weekNumber
|
||||
lastDayMoney = firstDayMoney + dayNumber - 1
|
||||
dayMoney = (firstDayMoney + lastDayMoney) * dayNumber // 2
|
||||
return weekMoney + dayMoney
|
||||
```
|
||||
|
||||
* [sol2-Java]
|
||||
|
||||
```Java
|
||||
class Solution {
|
||||
public int totalMoney(int n) {
|
||||
// 所有完整的周存的钱
|
||||
int weekNumber = n / 7;
|
||||
int firstWeekMoney = (1 + 7) * 7 / 2;
|
||||
int lastWeekMoney = firstWeekMoney + 7 * (weekNumber - 1);
|
||||
int weekMoney = (firstWeekMoney + lastWeekMoney) * weekNumber / 2;
|
||||
// 剩下的不能构成一个完整的周的天数里存的钱
|
||||
int dayNumber = n % 7;
|
||||
int firstDayMoney = 1 + weekNumber;
|
||||
int lastDayMoney = firstDayMoney + dayNumber - 1;
|
||||
int dayMoney = (firstDayMoney + lastDayMoney) * dayNumber / 2;
|
||||
return weekMoney + dayMoney;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
* [sol2-C#]
|
||||
|
||||
```C#
|
||||
public class Solution {
|
||||
public int TotalMoney(int n) {
|
||||
// 所有完整的周存的钱
|
||||
int weekNumber = n / 7;
|
||||
int firstWeekMoney = (1 + 7) * 7 / 2;
|
||||
int lastWeekMoney = firstWeekMoney + 7 * (weekNumber - 1);
|
||||
int weekMoney = (firstWeekMoney + lastWeekMoney) * weekNumber / 2;
|
||||
// 剩下的不能构成一个完整的周的天数里存的钱
|
||||
int dayNumber = n % 7;
|
||||
int firstDayMoney = 1 + weekNumber;
|
||||
int lastDayMoney = firstDayMoney + dayNumber - 1;
|
||||
int dayMoney = (firstDayMoney + lastDayMoney) * dayNumber / 2;
|
||||
return weekMoney + dayMoney;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
* [sol2-C++]
|
||||
|
||||
```C++
|
||||
class Solution {
|
||||
public:
|
||||
int totalMoney(int n) {
|
||||
// 所有完整的周存的钱
|
||||
int weekNumber = n / 7;
|
||||
int firstWeekMoney = (1 + 7) * 7 / 2;
|
||||
int lastWeekMoney = firstWeekMoney + 7 * (weekNumber - 1);
|
||||
int weekMoney = (firstWeekMoney + lastWeekMoney) * weekNumber / 2;
|
||||
// 剩下的不能构成一个完整的周的天数里存的钱
|
||||
int dayNumber = n % 7;
|
||||
int firstDayMoney = 1 + weekNumber;
|
||||
int lastDayMoney = firstDayMoney + dayNumber - 1;
|
||||
int dayMoney = (firstDayMoney + lastDayMoney) * dayNumber / 2;
|
||||
return weekMoney + dayMoney;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
* [sol2-C]
|
||||
|
||||
```C
|
||||
int totalMoney(int n){
|
||||
// 所有完整的周存的钱
|
||||
int weekNumber = n / 7;
|
||||
int firstWeekMoney = (1 + 7) * 7 / 2;
|
||||
int lastWeekMoney = firstWeekMoney + 7 * (weekNumber - 1);
|
||||
int weekMoney = (firstWeekMoney + lastWeekMoney) * weekNumber / 2;
|
||||
// 剩下的不能构成一个完整的周的天数里存的钱
|
||||
int dayNumber = n % 7;
|
||||
int firstDayMoney = 1 + weekNumber;
|
||||
int lastDayMoney = firstDayMoney + dayNumber - 1;
|
||||
int dayMoney = (firstDayMoney + lastDayMoney) * dayNumber / 2;
|
||||
return weekMoney + dayMoney;
|
||||
}
|
||||
```
|
||||
|
||||
* [sol2-Golang]
|
||||
|
||||
```go
|
||||
func totalMoney(n int) (ans int) {
|
||||
// 所有完整的周存的钱
|
||||
weekNum := n / 7
|
||||
firstWeekMoney := (1 + 7) * 7 / 2
|
||||
lastWeekMoney := firstWeekMoney + 7*(weekNum-1)
|
||||
weekMoney := (firstWeekMoney + lastWeekMoney) * weekNum / 2
|
||||
// 剩下的不能构成一个完整的周的天数里存的钱
|
||||
dayNum := n % 7
|
||||
firstDayMoney := 1 + weekNum
|
||||
lastDayMoney := firstDayMoney + dayNum - 1
|
||||
dayMoney := (firstDayMoney + lastDayMoney) * dayNum / 2
|
||||
return weekMoney + dayMoney
|
||||
}
|
||||
```
|
||||
|
||||
* [sol2-JavaScript]
|
||||
|
||||
```JavaScript
|
||||
var totalMoney = function(n) {
|
||||
// 所有完整的周存的钱
|
||||
const weekNumber = Math.floor(n / 7);
|
||||
const firstWeekMoney = Math.floor((1 + 7) * 7 / 2);
|
||||
const lastWeekMoney = firstWeekMoney + 7 * (weekNumber - 1);
|
||||
const weekMoney = Math.floor((firstWeekMoney + lastWeekMoney) * weekNumber / 2);
|
||||
// 剩下的不能构成一个完整的周的天数里存的钱
|
||||
const dayNumber = n % 7;
|
||||
const firstDayMoney = 1 + weekNumber;
|
||||
const lastDayMoney = firstDayMoney + dayNumber - 1;
|
||||
const dayMoney = Math.floor((firstDayMoney + lastDayMoney) * dayNumber / 2);
|
||||
return weekMoney + dayMoney;
|
||||
};
|
||||
```
|
||||
|
||||
**复杂度分析**
|
||||
|
||||
- 时间复杂度:$O(1)$。只需要用到常数时间。
|
||||
|
||||
- 空间复杂度:$O(1)$。只需要用到常数空间。
|
||||
|
Loading…
Reference in New Issue
Block a user