package acm;
import java.util.Scanner;
public class FatMouse_trade {
public static void QuickSort(int left, int right, int[] a){
int k = a[left];
int i = left, j = right;
while(i<j){
while(a[i]>=k&&i<j)
j--;
while(a[i]<k&&i<j)
i++;
if(i<j&&a[i]<a[j]){
swap(a, i, j);
}
}
a[left] = a[i];
a[i] = k;
QuickSort(left, i-1, a);
QuickSort(i, right, a);
}
public static void swap(int[] Temp, int a, int b){
int tmp = Temp[a];
Temp[a] = Temp[b];
Temp[b] = tmp;
}
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
int[] F = new int[1002];
int[] J = new int[1002];
int i,j;
while(scanner.hasNext()){
int M = scanner.nextInt();
int N = scanner.nextInt();
if(M==-1||N==-1)
break;
for(i=0; i<N; i++){
J[i] = scanner.nextInt();
F[i] = scanner.nextInt();
}
for(i=0; i<N-1; i++)
for(j=i+1; j<N; j++){
if(((double)J[i]/F[i])<((double)J[j]/F[j])){
// System.out.println(F[i]+" "+F[j]+" "+J[i]+" "+J[j]);
swap(F, i, j);
swap(J, i, j);
// System.out.println(F[i]+" "+F[j]+" "+J[i]+" "+J[j]);
/*int temp = F[i];
F[i] = F[j];
F[j] = temp;
temp = J[i];
J[i] = J[j];
J[j] = temp;*/
}
}
double max = 0.0;
for(i=0; i<N; i++){
if(F[i] > M){
max += M*((double)J[i]/F[i]);
break;
}
else if(F[i]<=M){
max += J[i];
M -= F[i];
}
}
System.out.println(String.format("%.3f", max));
}
}
}
在做这道题时,复习了几个排序算法,以及了解了在Java中交换整数的知识。先说一下排序吧,我这里用的是选择排序,你也可以选择用冒泡排序,或者其他的。我觉得这道题很重要的就是排序,因为一开始自己写的排序就错了,但那时候还没有意识到排序错了,因为觉得第一个测试用例可以通过,应该不是排序的问题,后来试了第二个却不能通过,掉换了一下第二测试用例的输入顺序,发现通过了,然后就开始检查自己的排序了,后来才发现自己在比较每个比例(即一开始是定义了scale[i] = (double)J[i]/F[i])),当换了J[i]和F[i],而没有把scale[i]也交换而出错了,所以后来就改了。自己遇到的还有一个问题就是超时,我一开始觉得是排序算法可能不够高效的问题,就想用快速排序这个算法,于是就出现下面的代码了
public static void QuickSort(int left, int right, int[] a){
int k = a[left];
int i = left, j = right;
while(i<j){
while(a[i]>=k&&i<j)
j--;
while(a[i]<k&&i<j)
i++;
if(i<j&&a[i]<a[j]){
swap(a, i, j);
}
}
a[left] = a[i];
a[i] = k;
QuickSort(left, i-1, a);
QuickSort(i, right, a);
}
public static void swap(int a, int b){
int tmp = a;
a = b;
b = tmp;
}
但我后来发现传出来的值还是一样的,而这里没有指针,因此就百度(嗯,百度)有一个比较好的博客,自己也是从那里看到的,他介绍了几个方法,我用了数组那个,地址在下面: