生活随笔
收集整理的這篇文章主要介紹了
我胡汉三又回来了之拼多多笔试复盘
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
天朗氣清,惠風和暢。一個陽光明媚的日子,王豆子終于想起了被leetcode支配的恐懼以及TA的csdn賬號,又回來了。
筆記本寫不下了,所以用博客記錄一下。
今天復盤一下拼多多的筆試,第一個題比較簡單懶得復盤了。那么主要看下本菜雞不會的題吧。
食堂吃飯
分中餐和晚餐, 每一餐又分若干種套餐. 每種套餐有熱量和美味值兩個屬性. 每餐最多只能選一種套餐(可不吃). 問在滿足能量值的情況下, 最少攝入的熱量. 返回最少的熱量, 如果不能達到美味值則返回-1.
public static void main(String
[] args
) {Scanner sc
= new Scanner(System
.in
);int n
= sc
.nextInt();int m
= sc
.nextInt();int t
= sc
.nextInt();TreeMap
<Integer,Integer> lunchMap
= new TreeMap<>(((o1
,o2
)->o2
-o1
));TreeMap
<Integer,Integer> dinnerMap
= new TreeMap<>(((o1
,o2
)->o2
-o1
));for(int i
=0;i
<n
;i
++){int hot
= sc
.nextInt();int beauty
= sc
.nextInt();if(lunchMap
.containsKey(beauty
) && lunchMap
.get(beauty
)<=hot
) continue;lunchMap
.put(beauty
,hot
);}for(int i
=0;i
<m
;i
++){int hot
= sc
.nextInt();int beauty
= sc
.nextInt();if(dinnerMap
.containsKey(beauty
) && dinnerMap
.get(beauty
)<=hot
) continue;dinnerMap
.put(beauty
,hot
);}int[][] lunch
= new int[lunchMap
.size()][2];int[][] dinner
= new int[dinnerMap
.size()][2];int i
=lunch
.length
-1;int minHot
= Integer
.MAX_VALUE
;for(Integer beauty
:lunchMap
.keySet()){minHot
= Math
.min(minHot
,lunchMap
.get(beauty
));lunch
[i
--] = new int[]{beauty
,minHot
};}i
= dinner
.length
-1;minHot
= Integer
.MAX_VALUE
;for(Integer beauty
:dinnerMap
.keySet()){minHot
= Math
.min(minHot
,dinnerMap
.get(beauty
));dinner
[i
--]= new int[]{beauty
,minHot
};}int ans
= Integer
.MAX_VALUE
;for(i
= 0;i
<lunch
.length
;i
++){if(lunch
[i
][0]>=t
){System
.out
.println(lunch
[i
][1]);return;}int j
= binarySearch(dinner
,t
-lunch
[i
][0]);ans
= Math
.min(ans
,lunch
[i
][1]+dinner
[j
][1]);}System
.out
.println(ans
);}private static int binarySearch(int[][] arr
, int target
){int low
= 0;int high
= arr
.length
-1;while(low
<high
){int mid
= (low
+high
)/2;int midV
= arr
[mid
][0];if(midV
>= target
){high
= mid
;}else {low
= mid
+ 1;}}return low
;}
要點總結
- 用dp[i] 表示當前美味值的最小熱量 , dp[i][0]表示當前美味值, dp[i][1]表示>=當前美味值的最小熱量, i是美味值有多少種可能。
- 例如,[[12,10],[10,11]], 經過處理后,成為[12,10],[10,10]]
- 因此,按照美味值排序后,熱量值也一定是非遞減的
- 基于熱量值是正序的,可以用二分簡化搜索,找到 t- lunch[i][0]的元素下標表示的熱量值一定最小
翻轉篩子
每一顆色子都有六面. 給出色子的個數和每一個色子的上下前后左右方位的點數. 色子可以旋轉. 問有多少種色子, 每種多少個(按照降序打印)
package Test
;import java
.util
.*
;
public class ArrayTest {public static void main(String
[] args
) {Scanner sc
= new Scanner(System
.in
);int n
= sc
.nextInt();int[][] nums
= new int[n
][6];HashMap
<String, Integer> map
= new HashMap<>();for(int i
= 0 ;i
<n
;i
++){int idx
= 0;for(int j
= 0;j
<6;j
++){nums
[i
][j
] = sc
.nextInt();if(nums
[i
][j
] == 1) idx
= j
;}if(idx
!=0) convertTo1(nums
[i
],idx
);boolean flag1
= nums
[i
][2]<nums
[i
][3];boolean flag2
= nums
[i
][2]<nums
[i
][3];if(!flag1
&& !flag2
){swap(nums
[i
],2,3);swap(nums
[i
],4,5);}else if(!flag2
){swap(nums
[i
],2,5);swap(nums
[i
],3,4);swap(nums
[i
],4,5);}else{swap(nums
[i
],2,4);swap(nums
[i
],3,5);swap(nums
[i
],4,5);}StringBuilder tmp
= new StringBuilder();for(int j
:nums
[i
]){tmp
.append(j
);}String key
= tmp
.toString();map
.put(key
,map
.getOrDefault(key
,0)+1);}System
.out
.println(map
.size());for(String k
:map
.keySet()){System
.out
.print(map
.get(k
));System
.out
.print(" ");}}private static void convertTo1(int[] arr
,int idx
){if(idx
== 1){swap(arr
,0,1);swap(arr
,2,3);}else if(idx
% 2==0){swap(arr
,idx
,0);swap(arr
,idx
+1,1);swap(arr
,idx
,idx
+1);}else{swap(arr
,idx
,0);swap(arr
,idx
-1,1);swap(arr
,idx
-1,idx
);}}private static void swap(int[]arr
, int i
,int j
){int tmp
= arr
[i
];arr
[i
] = arr
[j
];arr
[j
] = tmp
;}}
思路是參考牛客大神的
注釋也在代碼里寫清楚了
3. 種菜問題
拼爹爹果然是拼爹爹,明日再寫
總結
以上是生活随笔為你收集整理的我胡汉三又回来了之拼多多笔试复盘的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。