大家好,我是LvZi,今天带来
笔试狂刷--Day8
一.游游的you
题目链接:游游的you
分析:
模拟 + 贪心
先保证you
的数量,再处理剩余的oo
代码:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int q = in.nextInt();
while (q-- > 0) {
int a = in.nextInt(), b = in.nextInt(), c = in.nextInt();
int ret = 0;
int min = Math.min(a, Math.min(b, c));
if (min >= 1) ret += min * 2;
a -= min; b -= min; c -= min;
if(b > 0)
ret += (b - 1);
System.out.println(ret);
}
}
}
二.腐蚀苹果
题目链接:腐蚀苹果
分析:
多源bfs
代码:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param grid int整型ArrayList<ArrayList<>>
* @return int整型
*/
int[] dx = {1,-1,0,0};
int[] dy = {0,0,1,-1};
public int rotApple (ArrayList<ArrayList<Integer>> grid) {
// write code here
int m = grid.size(), n = grid.get(0).size(), ret = 0;
int[][] dist = new int[m][n];
Queue<int[]> q = new LinkedList<>();
boolean flg = false;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(grid.get(i).get(j) == 2) {
q.add(new int[]{i ,j});
flg = true;
}
else dist[i][j] = -1;
}
}
if(!flg) return -1;
while(!q.isEmpty()){
int[] t = q.poll();
int a = t[0], b = t[1];
for(int k = 0; k < 4; k++) {
int x = a + dx[k], y = b + dy[k];
if(x >= 0 && y >= 0 && x < m && y < n && dist[x][y] == -1 && grid.get(x).get(y) == 1) {
q.add(new int[]{x, y});
dist[x][y] = dist[a][b] + 1;
ret = Math.max(ret, dist[x][y]);
}
}
}
// 判断是否有未被腐蚀的平股票
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(dist[i][j] == -1 && grid.get(i).get(j) == 1)
return -1;
return ret;
}
}
三.孩⼦们的游戏(约瑟夫环)
题目链接:孩⼦们的游戏(约瑟夫环)
分析:
找规律
假设N = 15 M = 3
- 删除2
- 删除5(5 = 2 + M)
- 删除8(8 = 5 + M)
逆向思维:
如果最后只剩一个人,则一定是0位置(每删除一个人都是将下一个位置当做起始位置0),如果剩两个人,另一个人的位置是0 + M
,以此类推到一共有N个人的时候
代码:
public int LastRemaining_Solution (int n, int m) {
// write code here
int ans = 0;
for(int i = 2; i <= n; i++)
ans = (ans + m) % i;
return ans;
}