目录
一.巧排扑克牌 精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
二.质数拆分 精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
三.日志统计 精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
五.外卖店优先级 精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
一.巧排扑克牌
先看题:
这题的话,可以手推,但是会累人,然后第一次的6张牌其实很明显在2/4/6/8/10/12的位置,所以手推也只需要判断剩余7张牌的位置
但是身为一个准备蓝桥杯的人,怎么能不写个代码出来呢?
每一次,都把最下面一张放到最上面,总共13张牌,那么每2次拿出1张,最多26次就可以拿完,
那么我们可以定一个数组,然后给1-13位分别赋值为1-13,然后最后输出每一次取出的牌的位置,再把对应位置对上,即可
代码如下:
public class 巧排扑克牌 {
public static void main(String[] args) {
int []arr=new int[100];
for (int i=1;i<=13;i++){
arr[i]=i;
}
int []brr=new int[13];
int k=0,m=14;
for (int i=1;k<13;i++){
if(i%2==1){
arr[m]=arr[i];
m++;
}else{
brr[k]=arr[i];
k++;
}
}
String []s= {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
String []ss=new String[13];
for (int i=0;i<13;i++){
for (int j=0;j<13;j++){
if (brr[j]==i+1){
ss[i]=s[j];
}
}
}
for (int i=0;i<13;i++){
System.out.print(ss[i]);
if (i<12)
System.out.print(", ");
}
}
}
ps:输出的时候要一个英文 ","再加一个空格
二.质数拆分4
看题:
这题我一开始以为是两个质数相加为2019,可是后来才知道,不是那么简单
简单点说就是:把2019拆分成2个及以上 的不同质数,有多少种拆分方法?
这其实就相当于一个01背包问题,先把比2019小的所有质数求出,然后当成01背包进行运算
代码如下:
public class 质数拆分 {
public static void main(String[] args) {
int s=2;
int []arr=new int[2020];
long []brr=new long[2020];
arr[0]=2;arr[1]=3;
for (int i=4;i<2020;i++){
for (int j=2;j<=Math.sqrt(i);j++){
if (i%j==0)
break;
else if (j+1>Math.sqrt(i)){
arr[s]=i;
s++;
}
}
}//求出质数数组
brr[0]=1;
for (int i=0;i<s;i++){//质数数组长度
for (int j=2019;j>=arr[i];j--){//每一次取一个质数,来判断带上这个质数后,和前面的质数能合成哪些数字
//有点累死砝码称重,只不过一个是求合成某个数的方案,一个数求可以合成多少不同的数
brr[j]+=brr[j-arr[i]];
}
}
}
}
三.日志统计
看题看题:
怎么说呢,自己也写了一下午........
解析:有n条日志,我们可以按照主键ID,次键ts排序
然后一次循环,判断每一个id是不是热文
在循环的时候,注意保持第一个时间点和超过这个时间区间后第一个时间点的更换,以及当下一个编号和当前编号不同时的更改
代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class 日志统计 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//数据个数n
int d = sc.nextInt();//时间间隔d
int k = sc.nextInt();//达标个数k
int[][] arr = new int[n][2];
int maxs = 0;
for (int i = 0; i < n; i++) {
arr[i][0] = sc.nextInt();
arr[i][1] = sc.nextInt();
}
Arrays.sort(arr,((a,b)->{
if (a[1]!=b[1]){
return a[1]-b[1];
}
return a[0]-b[0];
}));
maxs=arr[n-1][1];
int t=0,s=-1,y=0,sum=0;
int []brr=new int[maxs+1];//记录热点编号
for (int i=0;i<n;i++){//循环
if (arr[i][1]!=s||brr[s]==1){//和上一个编号不同
t=arr[i][0];//记录时间
s=arr[i][1];//记录编号
y=i+1;//用于之后更改时间
sum=1;//统计点赞数
if (sum==k){//以防点赞要求为1
brr[s]=1;
}
}else if (arr[i][0]>=t+d) {//超过区间
sum++;//要算上当前点赞
while (arr[i][0]>=t+d) {//查找下一个不超过区间的位置
t = arr[y][0];
y++;
sum = Math.max(sum-1,1);//以防sum<1;
}
}else{
sum++;
if (sum==k){//热点
brr[s]=1;
}
}
}
for (int i=0;i<maxs+1;i++){//输出热点
if (brr[i]==1){
System.out.println(i);
}
}
}
}
四.递增三元组
看题吧:
解析:
三个数组,直接三个数组进行排序,两轮循环,第一轮循环判断第二个数组比第一个数组的每一个数多的个数,第二轮循环判断第三个数组比第二个数组的每一个数多的个数,然后计算一下第二个数组每一个数的使用次数,和对应的第三个数组对应的大于该数的数相乘求和即可
代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class 递增三元组 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int []arr=new int[n];
int []brr=new int[n];
int []crr=new int[n];
int []drr=new int[n];//brr比arr大的个数
int []err=new int[n];//crr比brr大的个数
int []frr=new int[n+1];
for (int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
for (int i=0;i<n;i++){
brr[i]=sc.nextInt();
}
for (int i=0;i<n;i++){
crr[i]=sc.nextInt();
}
Arrays.sort(arr);
Arrays.sort(brr);
Arrays.sort(crr);
int k=0,y=0;
for (int i=0;i<n;i++){
for (int j=k;j<n;j++){//第一轮循环
if (brr[j]>arr[i]){
k=j;
drr[i]=n-j;
break;
}
}
for (int j=y;j<n;j++){//第二轮循环
if (crr[j]>brr[i]){
y=j;
err[i]=n-j;
break;
}
}
}
for (int i=0;i<n;i++){
frr[n-drr[i]]=i+1;
}//计算第二个数列的每一个数的使用次数
long s=0,x=0;
for (int i=0;i<n;i++){
x=Math.max(x,frr[i]);
s+=(err[i]*x);//第三列比第二列每一个数多的个数*第二列对应树使用的次数
}
System.out.println(s);
}
}
五.外卖店优先级
未解,等!!!
这题还没解出来,两个测试
一个前五个对,50分
一个后三个对,30分