ABC005题的答案[Java]
首先
不知不觉间,我已经解答完这个比赛的所有问题了,所以打算把它发布出来。
那么,让我们开始看吧。
A – 做美味的章鱼烧的方法
请问问题是什么?
我们只需要求出x是y的几倍即可。
简单地进行除法运算即可,结果将会是向下取整的商。
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//x、yの受け取り
int x = sc.nextInt();
int y = sc.nextInt();
//切り捨て除算
System.out.println(y/x);
}
}
B – 如何享用美味的章鱼烧
问题见下文。
根据问题的要求,我们需要总结出输出$T$的最小值,因此我们计算了它。
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//Nの受け取り
int N = sc.nextInt();
int min = 1000; //最小値を求める用(大きければ初期値は何でも良い)
//最小値を探す
for(int i=0;i<N;i++){
int temp = sc.nextInt();
if(min>temp)
min = temp;
}
//答えの出力
System.out.println(min);
}
}
C – 可口的章鱼烧销售方式
这里是问题陈述。
我在处理时考虑到以下几点:
– 对于每个客户,提供的章鱼烧应该是在T秒内制作的最早的,这样才更有利。
– 基于上述思考,可以按照先来先服务的原则来进行处理。
因此,我将A和B分别放入ArrayDeque中,并只查看队列的头部元素,以便进行最优的处理。
import java.util.Scanner;
import java.util.ArrayDeque;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//T、Nの受け取り
int T = sc.nextInt();
int N = sc.nextInt();
//AをArrayDequeに
ArrayDeque<Integer> A = new ArrayDeque<>();
for(int i=0;i<N;i++)
A.add(sc.nextInt());
//Mの受け取り
int M = sc.nextInt();
//BをArrayDequeに
ArrayDeque<Integer> B = new ArrayDeque<>();
for(int i=0;i<M;i++)
B.add(sc.nextInt());
//お客さんに配っていく
while(B.size()>0){
//今来たお客さん
int order = B.pollFirst();
//条件を満たすたこ焼きが見つかるまで取り出す
int takoyaki = A.isEmpty()?order+1:A.pollFirst();
while(takoyaki+T<order)
takoyaki = A.isEmpty()?order+1:A.pollFirst();
//条件を満たすものが無かったら終わり
if(takoyaki>order){
System.out.println("no");
return;
}
}
//全員に提供できたらyes
System.out.println("yes");
}
}
D – 香脆美味的章鱼烧制作方法
问题文在这里。
由于约束条件较小,我们事先计算了关于D的二维累积和,并通过对每个店员可烤香肠的上限进行全搜索,从而求得矩形和的最大值。
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//Nの受け取り
int N = sc.nextInt();
//二次元累積和の構築
int[][] sumD = new int[N+1][N+1];
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
sumD[i][j] = sumD[i-1][j]+sumD[i][j-1]-sumD[i-1][j-1]+sc.nextInt();
}
}
//Qの受け取り
int Q = sc.nextInt();
while(Q-->0){
//Pの受け取り
int P = sc.nextInt();
//最大値の全探索
int max = 0;
//縦方向の幅を決め打つ
for(int x=1;x<=N;x++){
//横幅が求まる
int y = Math.min(N,P/x);
//右下の縦方向の座標
for(int i=x;i<=N;i++){
//右下の横方向の座標
for(int j=y;j<=N;j++){
max = Math.max(max,sumD[i][j]-sumD[i-x][j]-sumD[i][j-y]+sumD[i-x][j-y]);
}
}
}
//最大値のしゅつりょく
System.out.println(max);
}
}
}