目录
4782.第k个数
4783. 多米诺骨牌 - bfs 记录时间
4782.第k个数
java大顶堆
import java.util.*;
public class Main
{
public static void main(String[] args )
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt(),k=sc.nextInt();
k--;
PriorityQueue<Integer> q=new PriorityQueue<>((a,b)->(b-a));
for(int i=0;i<n;i++)
{
int x=sc.nextInt();
q.offer(x);
}
while(k-->0) q.poll();
System.out.print(q.peek());
}
}
4783. 多米诺骨牌 - bfs 记录时间
4783. 多米诺骨牌 - AcWing题库
思路:
bfs 从L或R开始逐层拓展观察影响
- 用 time[方向][下标] 记录左右被影响的时间
- 先让L 入队bfs 对于L左边的 '.' 逐层拓展记录被影响的时间
- 注意:只有竖直的牌也就是 '.' 会被影响 像L R不会因为另一个牌推它而改变自己的朝向
- 先让R 入队bfs 对于R右边的 '.' 逐层拓展记录被影响的时间
- 最后遍历整个s串
- 如果time[左][i]==time[右][i] 说明在同一时刻 被左右夹击 则该牌竖直 res++
- 另外包括 time[左][i]==time[右][i]==0 说明该牌没有被影响过 也res++
import java.util.*;
public class Main
{
static int n;
static String s;
private static int N=3010;
static int[][] time=new int[2][N];
static int[] dx={-1,1};
public static void bfs(int f)
{
Queue<Integer> q=new LinkedList<>();
for(int i=0;i<n;i++)
if(f==0)
{
if(s.charAt(i)=='L') q.offer(i);
}
else
{
if(s.charAt(i)=='R') q.offer(i);
}
while(q.size()>0)
{
int len=q.size();
while(len-->0)
{
int t=q.poll();
int cur=t+dx[f];
if(cur<0||cur>=n) continue;
if(s.charAt(cur)!='.') continue; //只有竖直的牌才可以被影响
time[f][cur]=time[f][t]+1; //被影响的时间为源点时长+1
q.offer(cur);
}
}
}
public static void main(String[] args )
{
Scanner sc=new Scanner(System.in);
int res=0;
n=sc.nextInt();
s=sc.next();
// for(int[] x:time) Arrays.fill(x,-1);
bfs(0); //先让L入队 统计向左倒的影响
bfs(1); //让R入队 统计向右倒的影响
for(int i=0;i<n;i++)
if(time[0][i]==time[1][i]&&s.charAt(i)!='L'&&s.charAt(i)!='R') res++; //如果向左倒和向右倒同一时间影响该牌 则该牌竖直
System.out.print(res);
}
}