杭电ACM1009

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值