这是一道经典排序题。题目是:悼念512汶川大地震遇难同胞——老人是真饿了,好像与排序没关系,呵呵。看完题目,我们都想到了得用到排序,我一开始也这么想,我首先想到的是冒泡,简单易想吗。用java写的
import java.util.Scanner;
//悼念512汶川大地震遇难同胞——老人是真饿了
//超时
public class Hd2187{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
int money = sc.nextInt();
int kinds = sc.nextInt();
int[] a = new int[kinds];
int[] b = new int[kinds];
for (int k = 0; k < kinds; k++) {
a[k] = sc.nextInt();
b[k] = sc.nextInt();
}
int temp,temp1;
for (int j = 1; j < kinds; j++) { // 给价格从小到大排序
for (int g = 0; g < kinds - j; g++) {
if (a[g] > a[g + 1]) {
temp = a[g + 1];
a[g + 1] = a[g];
a[g] = temp;
temp1=b[g+1]; //跟着价格a的排序同步变化
b[g+1]=b[g];
b[g]=temp1;
}
}
}
double sum = 0; // 最多可以买的大米重量
double money1 = (double) money;
for(int d = 0;d<kinds;d++){
if (money1 / a[d] > b[d]) {
sum += b[d];
money1 = money1 - b[d] * a[d];
} else {
sum += money1 / a[d];
break;
}
//
// if(money1==0) break;
}
System.out.printf("%.2f", sum).println();
sum = 0;
}
}
}
代码没有问题,可以试想题目所要求的。不过AC不了,超时了,所以得想方法。下面我们把冒泡排序换成了快速排序,这回AC了,大家可以作为经验,java做ACM本身就耗时多,以后遇到排序题,快排最简,代码如下
import java.util.Scanner;
public class Hd2187 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
int money = sc.nextInt();
int kinds = sc.nextInt();
int[] a = new int[kinds];
int[] b = new int[kinds];
for (int k = 0; k < kinds; k++) {
a[k] = sc.nextInt();
b[k] = sc.nextInt();
}
qSort(a, b, 0, kinds - 1); // 调用快排
double sum = 0; // 最多可以买的大米重量
double money1 = (double) money;
for (int d = 0; d < kinds; d++) {
if (money1 / a[d] > b[d]) {
sum += b[d];
money1 = money1 - b[d] * a[d];
} else {
sum += money1 / a[d];
break;
}
//
// money1 = money1 - sum * a[d];
// if(money1==0) break;
}
System.out.printf("%.2f", sum).println();
sum = 0;
}
}
// 快速排序
public static void qSort(int[] a, int[] b, int p, int r) {
if (p < r) {
int q = partition(a, b, p, r);
qSort(a, b, p, q - 1);
qSort(a, b, q + 1, r);
}
}
public static int partition(int[] a, int[] b, int p, int r) {
int i = p;
int j = r + 1;
int x = a[p];
while (true) {
while (a[++i] < x && i < r)
;
while (a[--j] > x)
;
if (i >= j)
break;
int temp = a[j];
a[j] = a[i];
a[i] = temp;
temp = b[j];
b[j] = b[i];
b[i] = temp;
}
int temp1 = b[j];
b[j] = b[p];
b[p] = temp1;
a[p] = a[j];
a[j] = x;
return j;
}
}