熱身題html
public class Main { public static void main(String[] args) { for(int i = 10; i < 100; i += 2){ System.out.println("本頁包括 : " + i + " 和 " + (i + 1)); } } }
我把它當作是一道考二叉樹的題. 考的是第k層的結點個數, 可是最後要加1, 這個1能夠理解成頭結點. 拿張紙條切一切和二叉樹的圖對比一下便可.java
public class Main { public static void main(String[] args) { System.out.println(getNoodles(10)); } public static int getNoodles(int n){ return (1 << n) + 1; } }
個人思路是先拼接出字符串, 而後經過數組原地調整的方式不斷縮字符串, 相似2013年第八題幸運數.c++
public class Main { public static void main(String[] args) { String s = ""; for(int i = 0; i < 106; i++){ s += "abcdefghijklmnopqrs"; } char[] arr = s.toCharArray(); int len = arr.length; int index = 0; while(len != 1){ for(int i = 0; i < len; i++){ if(((i + 1) & 1) == 0){ arr[index++] = arr[i]; } } System.out.println(arr[0]);//把縮完後每一次的開頭都打印出來, 以便檢驗. index = 0; len = len / 2; } } }
for(int i=1; i<100; i++) { if(________________) //填空 System.out.println(i*i/2); else System.out.println((i*i-1)/2); }
判斷一個數是否是偶數算法
double x = 111; for(int n = 10000; n>=0; n--){ int i = 2 * n + 1; x = 2 + (i*i / x); } System.out.println(String.format("%.4f", ______________));
<html> <img src="http://m.qpic.cn/psb?/V11njlod3LYfx7/eg.fjfObLv6lNDqbEaqOn4vZDFg73nRWowZJqkCiOR8!/b/dL8AAAAAAAAA&bo=pwHzAKcB8wADCSw!&rf=viewer_4" alt="" /> </html>數組
根據題目中的代碼能夠推算出x等於2+一大坨分數, 而後便可經過解方程獲得圓周率.瀏覽器
<html> <img src="http://m.qpic.cn/psb?/V11njlod3LYfx7/bOi6RTyWt92JCJHSt2sdqTy4eRz1sD0JHZ.NN.gadB8!/b/dLgAAAAAAAAA&bo=TwGLAQAAAAADB.Y!&rf=viewer_4"/> </html>測試
<html> <img src="http://m.qpic.cn/psb?/V11njlod3LYfx7/*gqAIs5TXPItcPmUCZRQBw0AAhhqlEHCSVYHIg0*p3g!/b/dDQBAAAAAAAA&bo=KQG*AAAAAAADB7U!&rf=viewer_4" /> <!--在這裏插入內容--> </html>this
解題思路: 按照題目的步驟判斷兩個結果是否相等, 兩個結果分別用4個變量湊出, 注意判斷相等的時候使用浮點類型.spa
public class Main { public static void main(String[] args) { int res = 0; float num1 = 0; float num2 = 0; for(float a = 1; a <= 9; a++){ for(float b = 1; b <= 9; b++){ if(b == a) continue; for(float c = 1; c <= 9; c++){ for(float d = 1; d <= 9; d++){ if(c == d) continue; num1 = (a * 10 + c) / (b * 10 + d); num2 = (a * c) / (b * d); if(num1 == num2){ res++; } } } } } System.out.println(res); } }
解題思路: 首先經過全排列找到全部的狀況, 而後在全部狀況中篩選符合題目要求的字符串. 最後比較符合要求的字符串的字典序, 經過比較器比較(各個語言都有).調試
public class Main { public static LinkedList<String> qua = new LinkedList<String>(); public static void main(String[] args) { String str = "AA223344"; process(str.toCharArray(), 0);//全排列 ArrayList<String> preList = new ArrayList<String>(); //拿到符合要求的序列 for(String s : qua){ if(isOk(s)){ preList.add(s); } } //按照字典序排序 Collections.sort(preList, new StringComparator()); System.out.println(preList.get(0)); } public static class Index{ public int first; public int last; public Index(int first){ this.first = first; } } public static boolean isOk(String s){ char[] arr = s.toCharArray(); HashMap<Character, Index> map = new HashMap<Character, T7.Index>(); for(int i = 0; i < arr.length; i++){ if(!map.containsKey(arr[i])){ map.put(arr[i], new Index(i)); }else{ Index index = map.get(arr[i]); index.last = i; map.put(arr[i], index); } } Index a = map.get('A'); if(a.last - a.first - 1 != 1){ return false; } Index b = map.get('2'); if(b.last - b.first - 1 != 2){ return false; } Index c = map.get('3'); if(c.last - c.first - 1 != 3){ return false; } Index d = map.get('4'); if(d.last - d.first - 1 != 4){ return false; } return true; } public static void process(char[] ori, int index){ if(index == ori.length){ qua.add(String.valueOf(ori)); return; } for(int i = index; i < ori.length; i++){ swap(ori, index, i); process(ori, index + 1); swap(ori, index, i); } } public static class StringComparator implements Comparator<String> { public int compare(String s1, String s2) { return s1.compareTo(s2); } } public static void swap(char[] ori, int i, int j){ char temp = ori[i]; ori[i] = ori[j]; ori[j] = temp; } }
【格式要求】 程序首先讀入一個整數N(2<N<100),表示小朋友的人數。 接着是一行用空格分開的N個偶數(每一個偶數不大於1000,不小於2) 要求程序輸出一個整數,表示老師須要補發的糖果數。 例如:輸入 3 2 2 4 程序應該輸出: 4 資源約定: 峯值內存消耗(含虛擬機) < 256M CPU消耗 < 1000ms
解題思路: 按照題目一路寫代碼
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] arr = new int[sc.nextInt()];//每一個孩子有多少糖 int[] tempCandy = new int[arr.length];//定義一個輔助數組保存每一個孩子給左邊孩子給多少糖 for(int i = 0; i < arr.length; i++){ arr[i] = sc.nextInt(); } int left = 0; int res = 0; boolean equal = false; //只要孩子的糖不相等就進行循環 while(!equal){ //每一個孩子付出糖 for(int i = 0; i < arr.length; i++){ tempCandy[i] = arr[i] / 2; arr[i] /= 2; } //每一個孩子接收糖 for(int i = 0; i < arr.length; i++){ left = getLeftIndex(i, arr); arr[left] += tempCandy[i]; } //老師發糖平衡天下 for(int i = 0; i < arr.length; i++){ if((arr[i] & 1) != 0){ arr[i] += 1; res++; } } //看看這一輪平了沒有 boolean isEqual = true; for(int i = 1; i < arr.length; i++){ if(arr[i] != arr[i - 1]){ isEqual = false; break; } } equal = isEqual ? true : false; } System.out.println(res); } public static int getLeftIndex(int index, int[] arr){ return index == 0 ? arr.length - 1 : index - 1; } }
數據格式】 輸入一行3個整數,用空格分開:n m k (1<=n,m<=50, 1<=k<=12) 接下來有 n 行數據,每行有 m 個整數 Ci (0<=Ci<=12)表明這個格子上的寶物的價值 要求輸出一個整數,表示正好取k個寶貝的行動方案數。該數字可能很大,輸出它對 1000000007 取模的結果。 例如,輸入: 2 2 2 1 2 2 1 程序應該輸出: 2 再例如,輸入: 2 3 2 1 2 3 2 1 5 程序應該輸出: 14 資源約定: 峯值內存消耗(含虛擬機) < 256M CPU消耗 < 2000ms
return res
以前取餘數. 最終有3個測試用例過不了, 由於每次遞歸的結果都有可能超過1000000007, 最後才進行取餘在樣本量極大的狀況下是會出錯的.public class T9 { public static int n; public static int m; public static int k; public static int[][][][] dp = new int[50][50][15][15];//用於記憶搜索 public static int[][] arr = new int[50][50]; public static void main(String[] args) { //處理輸入 Scanner sc = new Scanner(System.in); n = sc.nextInt(); m = sc.nextInt(); k = sc.nextInt(); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ arr[i][j] = sc.nextInt(); } } initDp();//初始化記憶數組,不能用java初始的0值,由於不少格子只有0種可能, 會形成重複搜索. System.out.println(process(arr, 0, 0, -1, 0));//寶藏的最小值爲0, 因此初始的max值爲-1 } public static int process(int[][] arr, int x, int y, int max, int cur){ if(dp[x][y][max + 1][cur] != -1){//max初始爲-1,爲防止越界填入max+1 return dp[x][y][max + 1][cur]; } if(x >= n || y >= m || cur > k){ return 0; } int value = arr[x][y]; if(x == n - 1 && y == m - 1){ if(cur == k || (value > max && cur == k - 1)){ return 1; } return 0; } int res = 0; if(value > max){//若是寶藏大於當前手上的最大值, 就能夠拿走. res += process(arr, x, y + 1, value, cur + 1);//每次遞歸完對結果取模, 不然數據量大的時候會出錯. res %= 1000000007; res += process(arr, x + 1, y, value, cur + 1); res %= 1000000007; } //不拿走 res += process(arr, x, y + 1, max, cur); res %= 1000000007; res += process(arr, x + 1, y, max, cur); res %= 1000000007; dp[x][y][max + 1][cur] = res; return res; } public static void initDp(){ for(int i = 0; i < 50; i++){ for(int j = 0; j < 50; j++){ for(int k = 0; k < 15; k++){ for(int l = 0; l < 15; l++){ dp[i][j][k][l] = -1; } } } } } }
i*x 行,第 j*y
列的硬幣進行翻轉。-【數據格式】
【樣例輸入】 2 3 【樣例輸出】 1 【數據規模】 對於10%的數據,n、m <= 10^3; 對於20%的數據,n、m <= 10^7; 對於40%的數據,n、m <= 10^15; 對於10%的數據,n、m <= 10^1000(10的1000次方)。 資源約定: 峯值內存消耗(含虛擬機) < 256M CPU消耗 < 2000ms
第i*x 行,第j*y
列的硬幣進行翻轉. 也就是說如今定位的硬幣座標是x,y, 是x的倍數的行都要翻, 是y的倍數的列也要翻.(x的因子數 * y的因子數)
那麼屢次x中有多少個平方數
和y中有多少個平方數
.原數位數 / 2 + 1
這麼多位.import java.math.BigInteger; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String n = sc.next(); String m = sc.next(); System.out.println(sqrt(n).multiply(sqrt(m))); } public static BigInteger sqrt(String num){ int numLen = num.length();//要開方的數字位數 int resLen = (numLen & 1) == 0 ? numLen / 2 : numLen / 2 + 1;//開方後數字的位數 char[] arr = new char[resLen];//用於嘗試結果的數組 Arrays.fill(arr, '0'); BigInteger target = new BigInteger(num); for(int pos = 0; pos < resLen; pos++){ for(char i = '1'; i <= '9'; i++){ arr[pos] = i; BigInteger pow = new BigInteger(String.valueOf(arr)).pow(2); if(pow.compareTo(target) == 1){ arr[pos] -= 1; break; } } } return new BigInteger(String.valueOf(arr)); } }