# 分巧克力_二分

## 题目描述

1. 形状是正方形，边长是整数。

2. 大小相同。

## 输入输出样例

```2 10
6 5
5 6  ```

`2`

## 代码：

``````package 第十四届蓝桥杯三月真题刷题训练.自由刷题;

import java.io.*;

/**
* @author yx
* @date 2023-04-03 18:11
*/
public class 分巧克力_二分 {
static PrintWriter out = new PrintWriter(System.out);
static StreamTokenizer in = new StreamTokenizer(ins);
static int[] H;
static int[] W;
static int K;
static int N;
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
* <p>
* 输出
* out.print();
* out.flush();
* <p>
* 读文件：
* if (s == null)break;读取文件终止的语句
**/
public static void main(String[] args) throws IOException {
N = Integer.parseInt(sp[0]);
K = Integer.parseInt(sp[1]);
H = new int[N];
W = new int[N];
for (int i = 0; i < N; i++) {
H[i] = Integer.parseInt(sp1[0]);
W[i] = Integer.parseInt(sp1[1]);
}
int l = 1;
int r = 100001;
int ans = 0;
while (l <= r) {
//二分
int mid = (l + r) / 2;
if (check(mid)) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
System.out.print(ans);
}

static boolean check(int n) {
int temp=0;
for (int i = 0; i < N; i++) {
temp+=(H[i]/n)*(W[i]/n);
}
if(temp>=K){
return true;
}else {
return false;
}
}
}
``````

# 巧克力 - 优先队列

```10 3
1 6 5
2 7 3
3 10 10```

```18
```

【样例说明】

【评测用例规模与约定】

## 代码：

``````package 第十四届蓝桥杯三月真题刷题训练.自由刷题;

import java.io.*;
import java.util.*;

/**
* @author yx
* @date 2023-04-03 18:28
*/
public class 巧克力_优先队列 {
static PrintWriter out = new PrintWriter(System.out);
static StreamTokenizer in = new StreamTokenizer(ins);

/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
* <p>
* 输出
* out.print();
* out.flush();
* <p>
* 读文件：
* if (s == null)break;读取文件终止的语句
**/
static class Node implements Comparable<Node> {
int id;
int price_a;
int day_b;
int number_c;

Node(int id, int price_a, int day_b, int number_c) {
this.id = id;
this.price_a = price_a;
this.day_b = day_b;
this.number_c = number_c;
}

//按保质期从高到低进行排序
@Override
public int compareTo(Node o) {
if (o.day_b > this.day_b) {
return 1;
} else {
return -1;
}
}
}
static class Node1  {
int id;
int price_a;
int day_b;
int number_c;

Node1(int id, int price_a, int day_b, int number_c) {
this.id = id;
this.price_a = price_a;
this.day_b = day_b;
this.number_c = number_c;
}
}

public static void main(String[] args) throws IOException {
int x = Integer.parseInt(sp[0]);
int n = Integer.parseInt(sp[1]);
Node[] nodes = new Node[n];
int[] nums = new int[n];
long ans = 0;
for (int i = 0; i < n; i++) {
nodes[i] = new Node(i, Integer.parseInt(sp1[0]), Integer.parseInt(sp1[1]), Integer.parseInt(sp1[2]));
}
//按保质期从高到低进行排序
Arrays.sort(nodes);
int j = 0;
//        Prio<Node1> priority_queue = new LinkedList<>();
PriorityQueue<Node1>priority_queue=new PriorityQueue<>(
new Comparator<Node1>() {
@Override
public int compare(Node1 o1, Node1 o2) {
return o1.price_a-o2.price_a;
}
}
);
for (int i = x; i >= 1; i--) {
while (j < n && nodes[j].day_b >= i) {
priority_queue.offer(new Node1(nodes[j].id,nodes[j].price_a,nodes[j].day_b,nodes[j].number_c));
j++;
}
//如果出现空队列表示没有选择了
if (priority_queue.size() == 0) {
out.println(ans);
out.println(-1);
out.flush();
return;
}
Node1 node = priority_queue.peek();
//表示当前id的物品个数+1
nums[node.id]++;
//            System.out.println("id："+node.id+"价格："+node.price_a+"购买数量："+nums[node.id]);
//加上当前物品的价格
ans += node.price_a;
//表示当前物品全部选完了
if (node.number_c == nums[node.id]) {
//                System.out.println("物品id:"+node.id+"出队");
//当前种类的物品已经全部选完了，所以当前物品出队
priority_queue.poll();
}
}
out.println(ans);
out.flush();
}
}
``````

# 蓝桥杯算法提高-秘密行动

```5
3
5
1
8
4```

`1`

## 代码：

``````package 第十四届蓝桥杯三月真题刷题训练.自由刷题;

import java.io.*;

/**
* @author yx
* @date 2023-04-04 16:56
*/
public class 秘密行动_dp {
static PrintWriter out =new PrintWriter(System.out);
static StreamTokenizer in=new StreamTokenizer(ins);
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
*
* 输出
* out.print();
* out.flush();
*
* 读文件：
* if (s == null)break;读取文件终止的语句
**/
public static void main(String[] args) throws IOException {
in.nextToken();
int n=(int) in.nval;
int[] nums=new int[n+1];
for (int i = 1; i <= n; i++) {
in.nextToken();
nums[i]=(int) in.nval;
}
//n表示需要走n层
//2表示两种下选择可以一步一步爬也可以直接跳跃
//其中下标[][0]表示爬,[][1]表示跳跃
int[][] dp=new int[n+1][2];
dp[1][0]=nums[1];//直接赋初值
for (int i = 2; i <= n; i++) {
//从上一层爬上来,上一层可以是爬的也可以是跳跃的
dp[i][0]=Math.min(dp[i-1][0],dp[i-1][1])+nums[i];
//直接跳跃，但是只能从爬的开始跳跃,并且每次可以跳两层或者一层，因为不能连续跳跃
dp[i][1]=Math.min(dp[i-1][0],dp[i-2][0]);
}
out.println(Math.min(dp[n][1],dp[n][0]));
out.flush();
}
}
``````

# 合并果子_优先队列

```3
1 2 9
```

```15
```

## 代码：

``````package 第十四届蓝桥杯三月真题刷题训练.自由刷题;

import java.io.*;
import java.util.PriorityQueue;

/**
* @author yx
* @date 2023-04-04 17:59
*/
public class 合并果子_优先队列 {
static PrintWriter out =new PrintWriter(System.out);
static StreamTokenizer in=new StreamTokenizer(ins);
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
*
* 输出
* out.print();
* out.flush();
*
* 读文件：
* if (s == null)break;读取文件终止的语句
**/
public static void main(String[] args) throws IOException {
in.nextToken();
int n=(int) in.nval;
//优先队列会自动排序
PriorityQueue<Integer>queue=new PriorityQueue<>();
for (int i = 0; i < n; i++) {
in.nextToken();
queue.offer((int)in.nval);
}
int a=0;
int b=0;
int ans=0;
while (queue.size()!=1){
if(!queue.isEmpty()){
a=queue.poll();
}
if(!queue.isEmpty()){
b=queue.poll();
}
queue.offer(a+b);
ans+=(a+b);
}
out.println(ans);
out.flush();
}
}
``````

# 回文平方数_进制转换API

```10
```

```1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
```

## 说明/提示

【数据范围】

USACO Training Section 1.2

## 代码：

``````package 第十四届蓝桥杯三月真题刷题训练.自由刷题;

import java.io.*;
import java.util.Locale;

/**
* @author yx
* @date 2023-04-04 16:33
*/
public class P1206回文平方数 {
static PrintWriter out =new PrintWriter(System.out);
static StreamTokenizer in=new StreamTokenizer(ins);
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
*
* 输出
* out.print();
* out.flush();
*
* 读文件：
* if (s == null)break;读取文件终止的语句
**/
public static void main(String[] args) throws IOException {
//           1、把十进制A+B的结果转换为D进制
//            Integer.toString(A+B,D)
//           2、把D进制的字符串”s“转成十进制
//            Integer.parseInt("s",D)
//            int anInt1 = Integer.parseInt("1000100", 2);//68
in.nextToken();
int number=(int) in.nval;
for (int i = 1; i <= 300; i++) {
if(isHuiWen(Integer.toString(i*i,number))){
out.println(Integer.toString(i,number).toUpperCase()+" "+Integer.toString(i*i,number).toUpperCase(Locale.ROOT));
}
}
out.flush();
}
static boolean isHuiWen(String s){
char[] arr=s.toCharArray();
int length=arr.length;
for (int i = 0; i < length/2; i++) {
if(arr[i]!=arr[length-i-1]){
return false;
}
}
return true;
}
}
``````

THE END

)">