事前に注意してください:
この記事のタイトルは以下から転載しています: (61 メッセージ) Java Backend Meituanbi Test Questions_最も眩しい星空のブログ - CSDN Blog
この記事の解決策は次から転載されています: 5.7 Meituan Backend Written Exam 20min AK AK_Pen Jing Mian Jing_Niuke.com
この記事は、元のコードにいくつかのわかりやすいメモを追加した、著者の学習プロセスです。(侵害していたら削除します)
トピック 1:
Xiaotuan は小さな水槽で魚を飼育し、餌として A、B、C の 3 種類の餌を購入しました。Xiaotuan の給餌計画は次のとおりです: —— 月曜日、金曜日、土曜日に、タイプ A の餌を 8 粒与え
ます; ——
毎週火曜日と日曜日にBタイプの飼料を5ペレット与えます;
——毎週水曜日と木曜日にCタイプの飼料を7ペレット与えます。
ある月曜日に、Xiaotuan が A、B、C の飼料の a、b、c 個を一度に購入し、その日から飼育を開始したとします。Xiaotuan が給餌計画に従って給餌した場合、このバッチはどうすればよいでしょうか餌の量は何日まで食べられますか(月曜日も一日として数えます)?
サンプル入力
8 6 6
サンプル出力
2
import java.util.Scanner;
public class Main_0 {
public static void main(String[] args) {
//模拟
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int c = scanner.nextInt();
//判断能喂食几天
int da = a /8;
int db = b /5;
int dc = c /7;
int res =0;
for (int i = 1; ;i++) {
int r = i % 7;
switch (r){
case 1:
case 5:
case 6:
if(da == 0 ){
System.out.println(res);
return;
}
da--;
res++;
break;
case 0:
case 2:
if(db == 0 ){
System.out.println(res);
return;
}
db--;
res++;
break;
case 3:
case 4:
if(dc == 0 ){
System.out.println(res);
return;
}
dc--;
res++;
break;
default: return;
}
}
}
}
質問 2:
Xiaomei は、「0」と「1」の 2 つの文字だけを含む文字列を取得しました。今度は、この文字列の任意の位置に任意の文字「1」を追加できます。作成するには、少なくとも「1」を何文字追加する必要がありますか?追加された文字列は回文ですか?
入力の説明
最初の行は整数 T で、T セットのデータがあることを示します。
次の T 行、行 i は、「0」と「1」の 2 つの文字のみを含む文字列 si です。
1<=T<=10、1<=文字列の長さ si<=100000
出力の説明
T 行、各行は整数を持ち、i 番目の行は文字列 si に「1」を追加する必要がある文字の数を示します。入力説明文を回文文字列にします。
入力例
4
10101
00001
01001101
1110
出力例
0
1
2
3
サンプル説明
追加した文字列を[]で表します:
10101=>10101、追加なしの回文文字列です。
00001=>[1]00001
01001101=>[1]01[1]001101
1110=>1110[1][1][1]
import java.util.Scanner;
public class Main_1 {
public static void main(String[] args) {
//双指针
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
do {
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = add(sc.next());
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
} while (n >= 1 && n <= 10);
}
private static int add(String str){
int res =0;
//字符串转成字符型数组
char[] s=str.toCharArray();
int l=0,r=s.length-1;
while(l<r){
if(s[l] == s[r]){
l++;
r--;
}else if(s[l] == '1'){
res++;
l++;
}else{
res++;
r--;
}
}
return res;
}
}
トピック 3:
制限時間: 3000MS
メモリ制限: 589824KB
トピックの説明:
Xiao Tuan は無限に長い 1 次元の座標軸でアドベンチャー ゲームをプレイします。最初は原点にいて、k ポイントの体力を持っています。前方向に1マス移動するごとにスタミナを少し消費します(逆方向には移動できません)。小グループの体力は常にゼロ以下にならないことが求められます。座標軸上のn個の座標に体力ポーションが存在することがわかっており、その座標に到達すると体力を一定量回復できる。Xiaotuan は、到達できる最も遠い座標はどのくらい離れているのか知りたいと考えています。
<p>
入力説明
1行目には、小集団が最初に体力をk点持っており、座標軸上のn個の座標に体力ポーションがあることを示す2つの正の整数k、nが示されています。
次の行には n 個の正の整数が含まれており、i 番目の数値 xi は、xi の座標に物理的なポーションがあることを示します。(xi は互いに異なります)
次の行には n 個の正の整数が含まれており、i 番目の数字 ti は、xi の座標にあるスタミナ ポーションが ti ポイントのスタミナを回復できることを示します。
1<=k <=2000000、1<=n<=20000、1<=xi<=100000000、1<= ti<=10000 出力の説明 1 行につき 1 つの正の整数。小グループが到達できる最も遠い座標を示します
。入力例5 2 6 3 1 2出力例ヒント8 個説明例 1最初の体力は 5 ポイント、座標 3 に到達すると体力が 2 ポイント残り、2 ポイント追加して合計 4 になります。ポイント; 1 ポイント、1 ポイントを追加し、合計 2 ポイント;使い果たした場合は 8 をコーディネートします。入力例 2 2 1
2
1
出力例 2
3
例の説明 2
最初は体力が 2 ポイントあり、座標 2 に体力 1 ポイントを加えて座標 3 になります。
入力例 3
2 1
3
1
出力例 3
2
例の説明 3
体力は最初に 2 点あり、座標 2 に達すると体力の消耗が止まります。
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main_2 {
public static void main(String[] args) {
//底层逻辑——预排序+模拟
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int n = sc.nextInt();
int[] x = new int[n];
int[] t = new int[n];
for (int i = 0; i < n; i++) {
x[i] = sc.nextInt();
}
for (int i = 0; i < n; i++) {
t[i] = sc.nextInt();
}
//案例
// 5 2
// 6 3
// 1 2
// 输出8
PriorityQueue<int[]> que = new PriorityQueue<>((a, b) -> a[0] - b[0]);
for (int i = 0; i < n; i++) {
//优先队列 默认是小顶堆 最小元素在堆顶
que.add(new int[]{x[i],t[i]});
//[3,2] [6,1]
}
//判断站点
int res = 0;
while(!que.isEmpty()){
//取堆顶,且去除,先[3,2]再[6,1]
int[] xt = que.poll();
//剩余体力是否能到达第一个点
if (k + res < xt[0]){
res += k;
System.out.println(res);
return;
} else {
//能的话,先吧到第一个点剩余体力算出来,然后加上奖励的体力
//此时站点在xt[0]->(赋值给)res
k -= xt[0] - res;
k += xt[1];
res = xt[0];
}
}
//都执行结束,还有体力就多走k步
System.out.println(res + k);
}
}
トピック 4:
バウチャー
時間制限: 3000MS
メモリ制限: 589824KB
トピックの説明:
Xiaomei と Xiaotuan は夕食のためにレストランに来ました。 Meituan には多くのバウチャーがあり、xi 元を購入するようなもので、yi 元として使用できます (yi>xi を保証) )。購入できるクーポンは最大 1 枚のみです。
レストランのそれぞれの料理には、提供できる価格 ai と満足度 bi があります。ご注文は各料理につき1食分のみとさせていただきます。
バウチャーは変更なしで 1 回限りです。この消費の価格がバウチャーで引き換えられる価格を超えない場合は、バウチャーを使用して今回のすべての消費を相殺できます。この消費の価格が高ければ、バウチャーを使用してすべての消費を相殺できます。バウチャーのオフセット価格を超える場合は、超過部分をお支払いいただく必要があります。
以下に 2 つの例を示します:
——今回、270 元を使う必要がある場合、Xiaomei と Xiaotuan は 250 元を費やして 300 元を相殺するために使用できるバウチャーを購入し、このバウチャーを使用して支払いを全額相殺できます。費用は 250 元;
——この消費に 230 元が必要で、シャオメイとシャオトゥアンが 199 元を相殺するために使用できるバウチャーを購入するために 150 元を費やした場合、バウチャーを使用して 199 元を相殺できますが、それでも支払う必要があります。余った230元-199=31元、実際には150+31=181元を使いました。
今回の食事の予算が k 元だとすると、彼らが得られる最高の満足度はいくらでしょうか?
入力説明
最初の行には 3 つの整数 n、m、k が含まれています。それぞれ、美団には n 種類のクーポンがあり、レストランのメニューには m 種類の料理があり、小美と小団の予算は k 元であることを示しています。
次の n 行では、各行に 2 つの整数があり、i 番目の行 xi と yi はそれぞれ、バウチャーの価格が xi 元であり、yi 元によって相殺できることを示しています。
次の m 行目はそれぞれ 2 つの整数で、i 行目の ai と bi は料理の価格が ai 元、その料理が与える満足度が bi を表しています。
1<=n<=20,1<=m<=200, 1<=k<=10000, 1<=xi<=yi<=20000, 1<=ai,bi<=500 出力の説明 整数を出力し
ます
。 Xiaomei と Xiaotuan が予算内でどの程度の満足度を得ることができるかを示します。
入力例
2 3 10
7 10
10 12
7 4
2 4
5 6
出力例
10プロンプト サンプル説明注文した
料理は 1 番目と 3 番目、満足度は 10、支払いは 12 元必要です。最初のタイプのバウチャーを選択し、10元で使用し、追加の2元を支払います。合計費用は7+2 = 9元で予算内です。また、2番目のタイプのバウチャーを選択することもできます。 、追加料金なしで12元で直接使用でき、費用は10元で、予算内です。
import java.util.Scanner;
public class Main_3 {
public static void main(String[] args) {
//背包问题,动态规划(dp)
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// n种代金券
int m = sc.nextInt();
// m种菜品
int k = sc.nextInt();
// k预算金额
int money = k;
for (int i = 0; i < n; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
if(k > x) {money = Math.max(k-x+y,money);}
//节省几块
}
int[] w = new int[m];
//价格
int[] v = new int[m];
//满意度
for (int i = 0; i < m; i++) {
w[i] = sc.nextInt();
v[i] = sc.nextInt();
}
int[][] dp = new int[m + 1][money + 1];
//dp[i][j]:使用 j钱 在 前i个菜品中选获得的最大满意度
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= money; j++) {
if (j > w[i-1]){
//'背包能装下'
dp[i][j] = Math.max(dp[i-1][j-w[i-1]] + v[i-1], dp[i-1][j]);
} else {
dp[i][j] = dp[i-1][j];
}
}
}
System.out.println(dp[m][money]);
}
}