今日学习📃
🎋1、巧拼扑克牌
package Day_Day_work;
/**
* @author yx
* @date 2022-03-13 10:17
*/
public class 巧排扑克牌 {
// 1:输出是逗号+空格
public static void main(String[] args) {
System.out.print("7, A, Q, 2, 8, 3, J, 4, 9, 5, K, 6, 10");
}
}
🎃2、质数拆分
package Day_Day_work.problem;
/**
* @author yx
* @date 2022-03-13 10:52
*/
public class 质数拆分__01背包问题 {
static long[] a=new long[2020];
static int[] p=new int[2020];
public static void main(String[] args) {
a[0]=1;
int n=1;
for(int i=1;i<2019;i++)
{
if(pd(i))
{
p[n++]=i;
}
}
/**
* 下面是01动规核心代码
*/
for(int i=1;i<=n-1;i++) {
for(int j=2019;j>=p[i];j--) {
a[j] += a[j-p[i]];
}
}
System.out.println(a[2019]);
}
static boolean pd(int x) {//质数判断
if(x==1)
{
return false;
}
for(int i=2;i<=(int) Math.sqrt(x);i++)
{
if(x%i==0)
{
return false;
}
}
return true;
}
}
🖼️3、日志统计
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
1
3
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
package Day_Day_work;
import java.util.*;
/**
* @author yx
* @date 2022-03-13 15:19
*/
public class 日志统计__尺取法 {
static class R{
int ts;//时刻
int td;//id
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N=scanner.nextInt(),D=scanner.nextInt(),K=scanner.nextInt();
R[] rs=new R[N];
for (int i = 0; i < N; i++) {
R r=new R();
r.ts=scanner.nextInt();
r.td=scanner.nextInt();
rs[i]=r;
}
//匿名内部类定义排序器
Arrays.sort(rs, new Comparator<R>() {
@Override
public int compare(R o1, R o2) {
return o1.ts-o2.ts;//表示按时刻的升序来排列
}
});
//用于给id计点赞数
Map<Integer,Integer> cnt=new HashMap<>();
//用于存储答案,TreeSet自动对集合中的元素进行升序排序
SortedSet<Integer> answer=new TreeSet<Integer>();
/*
尺取法
*/
int j=0;
for (int i = 0; i < N; i++) {
while (j<N&&rs[j].ts-rs[i].ts<D){//左闭右开,时间区间不能超过D
int td=rs[j].td;
Integer exist=cnt.get(td);
if(exist!=null){//不为空的情况下
cnt.put(td,exist+1);//该id的点赞次数+1
}else {//最开始的情况
cnt.put(td,1);//该id第一次出现,直接给赋值为1
}
if(cnt.get(td)>=K){//当点赞次数超过K时加入到answer集合中
answer.add(td);
}
j++;//往后继续取区间
}
//退出while循环后,i往后移动会+1,则当前的i的点赞数-1,因为后面的区间最小值为i+1
//不包括i,将该id下的点赞数-1
Integer c=cnt.get(rs[i].td);//获取该id下的点赞数
if(c!=null){
cnt.put(rs[i].td,c-1);//更新点赞数
}
}
for (Integer i:answer) {
System.out.println(i);
}
}
}
🎄4、递增三元组
package Day_Day_work;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author yx
* @date 2022-03-13 16:02
*/
public class 递增三元组 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int A[] = new int[N];
int B[] = new int[N];
int C[] = new int[N];
for (int i = 0; i < N; i++) {
A[i] = scanner.nextInt();
}
for (int i = 0; i < N; i++) {
B[i] = scanner.nextInt();
}
for (int i = 0; i < N; i++) {
C[i] = scanner.nextInt();
}
//计数
int a = 0;
int b = 0;
int c = 0;
//升序排列
Arrays.sort(A);
Arrays.sort(B);
Arrays.sort(C);
int j = 0;
int k = 0;
long ans=0;
for (int i = 0; i < N; i++) {
while (j<N&&A[j]<B[i])j++;
while (k<N&&C[k]<=B[i])k++;
ans+=(long) (N-k)*j;
}
System.out.println(ans);
}
}
🎍5、外卖店优先级
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
1
6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
运行限制
- 最大运行时间:2s
- 最大运行内存: 256M
package Day_Day_work;
import java.util.Scanner;
/**
* @author yx
* @date 2022-03-13 19:42
*/
/*
仔细读题:
1、优先级最低减到 0
2、优先级大于 5,则会被系统加入优先缓存(进入优先缓存后还有可能被移除)
思路:
1、先模拟,再全部遍历
*/
public class 外卖店优先__暴力模拟 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N=scanner.nextInt();//M行数据输入
int M=scanner.nextInt();//N家店
int T=scanner.nextInt();//给定的一个时刻
int A[][]=new int[N][T];
int ans=0;//计数
for (int i = 0; i < M; i++) {
int ts=scanner.nextInt();//输入时刻
int id=scanner.nextInt();//输入店的id
A[id-1][ts-1]+=1;//表示这家店来了一个订单
}
for (int i = 0; i < N; i++) {//对每一家店做处理
int level=0;//优先级
boolean k=false;//是否能够加入优先缓存
for (int i1=0;i1<T;i1++){
if(A[i][i1]==0){//表示没有订单
level-=1;
if(level<0){
level=0;
}
if (level<=3){
k=false;
}
}else {
level+=(2*A[i][i1]);
if(level>5){
k=true;
}
}
}
if(k){
ans++;
}
}
System.out.println(ans);
}
}
💖写在最后
每日一题,我们一直在路上,这次的题目有点小难度,比较有挑战性
也充分认识到了自己的不足,比如说在动规背包问题上的薄弱,博主接下来将有针对性地加强训练
“心若有所向往,何惧道阻且长,各位有志青年,一起加油 !”
欢迎一起交流讨论!