杭电ACM1009

来源:互联网 发布:听力打卡的软件 编辑:程序博客网 时间:2024/06/05 17:23
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);}

并且试了他的测试用例:0 3100 0100 0100 0而这个测试用例,我的代码不能通过,所以就把While循环去掉,这个循环也是不必要的,因为M不会小于0。好了,所以这样就过了。再来就是说一下交换吧,在java,c和c++中值传递的话不会传递出被修改后的值,而是原来的值,这是我自己试过的了,我一开始是这样的:

public static void swap(int a, int b){        int tmp = a;         a = b;         b = tmp;}

但我后来发现传出来的值还是一样的,而这里没有指针,因此就百度(嗯,百度)有一个比较好的博客,自己也是从那里看到的,他介绍了几个方法,我用了数组那个,地址在下面:

http://blog.csdn.net/speedme/article/details/25109817

好啦,就到这。

0 0