寫在前面
1、第一題
題目描述
現有一個n個整數的序列,你要做的就是交換兩個數的位置直到整個序列按照升序排列,那么將這個整數序列排好序,需要交換多少次?例如,1,2,3,5,4,我們只需要交換一次,即將5和4交換即可。
輸入
輸入第一行為測試數據組數T(0<T<1000)
接下來輸入一個正整數n(n≤1000),表示數字序列的元素個數,占一行;
接下來一行輸入從1到n的n個整數排序,中間用空格隔開
輸出
序列升序排列需要的最少交換次數
樣例輸入
2
3
1 2 3
4
4 3 2 1
樣例輸出
0
6
題目分析
冒泡排序是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
這道題明顯是考察冒泡排序,記錄交換次數。
代碼如下:
import java.util.Scanner;
public class Main {
public static int bubbleSort(int[] nums) {
if (null == nums)
return -1;
int count = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = nums.length - 1; j > i; j--) {
if (nums[j] < nums[j - 1]) {
swap(nums, j, j - 1);
count++;
}
}
}
return count;
}
public static void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
int T = cin.nextInt();
for (int i = 1; i <= T; i++) {
int n = cin.nextInt();
int[] num = new int[n];
for(int j = 0;j<n;j++){
num[j] = cin.nextInt();
}
int res = bubbleSort(num);
System.out.println(res);
}
}
cin.close();
}
}
重點來了,我提交的結果是通過90%的測試,我感覺可能是一些邊界條件沒有考慮。但是思考很久,還是沒找到問題所在。
歡迎各路大神給出意見。
1、第一題
題目描述
Arthur買了新桌子,桌子有很多條桌腿支撐,可是回家后發現桌子不穩,原來是桌子腿長度不太相同,他想要自己把桌子修理好,所以他決定移除掉一些桌腿來讓桌子變得平穩。桌子腿共n條腿,第i條腿長度為l_i,Arthur移除第i桌腿要花費代表為d_i。假設k條腿桌子平穩的條件:超過一半桌腿能夠達到桌腿長度的最大值。例如:一條腿的桌子是平穩的,兩條腿的桌子腿一樣長時是平穩的。請你幫Arthur計算下桌子變平穩的最小總代價。
輸入
第一行是一整數:n(1 <= n <= 10^5),n表示桌腿總數
第二行數據是n個整數:l_1,l_2,...,l_n(1 <= l_i <= 10^5),表示每條桌腿的長度
第三行數據是n個整數:d_1,d_2,...,d_n(1 <= d_i <= 200),表示移除每條腿的代價
輸出
讓桌子變平穩的最小總代價
樣例輸入:
6
2 2 1 1 3 3
4 3 5 5 2 1
輸出
8
題目分析
- 按桌腿長度進行排序,對應的代價數組也進行交換,保證一一對應。
- 從最高的桌腿長度len開始,如果選取最高桌腿長度為len,如果長度為len的桌腿超過一半,則代價為0,在剩余桌腿里進行移除,按代價從小到大,只要滿足長度為len的桌腿超過一半,就可停止。
- 每次選擇一個高度h作為最高高度,注意,當h作為最高高度時,所以比h大的桌腿已經移除,然后計算在比h低的桌腿里移除,以滿足長度為h的桌腿超過一半
代碼如下:
寫的有點亂。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void bubbleSort(int[] a, int[] b) {
if (null == a)
return;
for (int i = 0; i < a.length; i++) {
for (int j = a.length - 1; j > i; j--) {
if (a[j] < a[j - 1]) {
swap(a, j, j - 1);
swap(b, j, j - 1);
}
}
}
}
public static void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
public static int countCost(int[] a, int[] b) {
int cost = 0;
int min = Integer.MAX_VALUE;
int maxHigh = a[a.length - 1];
int post = b[a.length - 1];
int before = 0;
int cnt = 0;
for (int i = a.length - 2; i >= 0; i--) {
while (i >= 0 && maxHigh == a[i]) {
post += b[i];
i--;
cnt++;
}
cost = cntCostpart(b, 0, i, before, cnt);
before = post;
if (min > cost)
min = cost;
cnt = 0;
if (i >= 0) {
maxHigh = a[i];
post += b[i];
cnt++;
}
}
return min;
}
public static int cntCostpart(int[] b, int start, int end, int before,
int cnt) {
int len = cnt + (end - start + 1);
int leave = end - start + 1;
if (end <= start || cnt > (int) (len / 2))
return before;
int res = 0;
int[] tmp = Arrays.copyOfRange(b, start, end + 1);
Arrays.sort(tmp);
int tmpCnt = 0;
for (int i = 0; i < tmp.length; i++) {
res += tmp[i];
tmpCnt++;
if (cnt > (leave - tmpCnt))
break;
}
return res + before;
}
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
int n = cin.nextInt();
int[] numl = new int[n];
int[] numd = new int[n];
for (int i = 0; i < numl.length; i++)
numl[i] = cin.nextInt();
for (int i = 0; i < numd.length; i++)
numd[i] = cin.nextInt();
bubbleSort(numl, numd);// sort array
int cost = countCost(numl, numd);
System.out.println(cost);
}
cin.close();
}
}