標簽:println 測試用例 align 只有一個 測試 發現 ++ 正式 圖片
網易內推面試涼了,再戰正式批筆試,選擇和簡答略難,編程題很良心,基本就是模擬、找規律,略加思考就能解出來的題目,本弱雞只有在良心網易筆試才能AK。
這題一開始沒思路,ac了后兩題后再回來思考,發現只需要判斷某個位置周圍有幾個點,就代表了那個位置會被別的點翻轉幾次,那么如何求周圍有幾個點呢?
簡單的把位置分成3類:
一類是四個頂點:每個頂點會被翻轉4次(加上自己翻轉一次)。
第二類是四條邊(不含頂點):邊上的點會被翻轉6次。
第三類就是中間部分:中間的每個點會被翻轉9次。
因此翻轉9次的點就是我們需要的啦,求出中間部分的數量即可,再考慮只有一條邊的時候,只有一個點的時候是特殊的,別的都是邊長度 -2 。
(坑!數據量n,m是10^10,所以相乘的結果肯定比int大,要用long!然后2*(n+m-2)沒用long轉型也沒過,小小的懷疑一下數據是不是比給的10^10范圍還要大一點點)。
代碼如下:
1 public static void main(String[] args) { 2 Scanner in = new Scanner(System.in); 3 while (in.hasNextInt()) {// 注意while處理多個case 4 int t = in.nextInt(); 5 while (t != 0) { 6 int n = in.nextInt(); 7 int m = in.nextInt(); 8 helper(n,m); 9 t--; 10 } 11 } 12 } 13 14 15 static void helper(int n,int m){ 16 if(m < n){ 17 int t = n; 18 n = m; 19 m = t; 20 } 21 if(n == 1 && m == 1){ 22 System.out.println(1); 23 }else if (n == 1) { 24 System.out.println(m-2); 25 }else { 26 long res = 1; 27 System.out.println(res*n*m-2*(n+m-2)); 28 } 29 }
找規律:
最小可能就是所有人都擠在一起,不管怎么樣都沒有位置可以住,所以直接輸出0,
最大可能分成兩種情況:
已經住進去的人比房子數一半(實際是一半+1)小,那么就可以“#.#.#”這樣排序,那么最大的可能數就是已經住進去的人數減1。
另一種情況,多出來的人會把可能的位置占掉,那么最多情況就是剩下的空位,因為每個位置都是可以住的。
上代碼:
1 public static void main(String[] args) { 2 Scanner in = new Scanner(System.in); 3 while (in.hasNextInt()) {//注意while處理多個case 4 int t = in.nextInt(); 5 while(t!=0){ 6 int n = in.nextInt(); 7 int k = in.nextInt(); 8 int max = 0; 9 if(k >= 2 && n > k){ 10 if(k <= (n+1)/2){ 11 max = k-1; 12 }else { 13 max = n-k; 14 } 15 } 16 17 System.out.println(0 + " " + max); 18 t--; 19 } 20 } 21 }
想了幾分鐘沒有特別好的解法,只能硬著頭皮模擬,n,m的數據量有兩個令我很疑惑,當時的想法就是做個模擬跑個20%的測試用例也夠了,然后模擬完了之后發現過了!!
上代碼:
public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) {//注意while處理多個case int n = in.nextInt();//n層 int m = in.nextInt();//m條指令 int[] array = new int[n+1]; int[] now = new int[n+1]; for(int i = 0;i<n;i++){ array[i+1] = in.nextInt(); } for(int j = 0;j<m;j++){ int inc = in.nextInt(); if(inc == 2){ int deepth = in.nextInt(); int num = in.nextInt(); add(deepth, num, array, now); }else if (inc == 1) { int deepth = in.nextInt(); System.out.println(now[deepth]); } } } } static void add(int n,int num,int[] array,int[] now){ int maxadd = 0; for(int i = n;i<array.length;i++){//每一層流下來 maxadd = array[i] - now[i]; if(maxadd >= num){//比當前層最多能容納的少就直接倒進去,返回 now[i] += num; return; } now[i] = array[i]; num -= maxadd; } }
標簽:println 測試用例 align 只有一個 測試 發現 ++ 正式 圖片
原文:https://www.cnblogs.com/zzzdp/p/9610135.html