2019.11.22 洛谷 acm新手村 买铅笔

(前方啰嗦,可略过本段)这一道题对我来说注定是一道有非凡意义的题。我大约是昨天下午开始写的,算上今天的改进优化(虽然这是一道入门题),至少得用了小半天时间。一开始看到这一道题时跟前几道一样,都感觉有些难,想看一下题解再写,可是可能是已经写了几道的原因吧,就先尝试着自己先写了一下,这道题要先输入一个数据,再输入3对数据,应该是受上一道题影响比较大,我就想着用for循环输入3组数据。可是写着发现,这道题是选最小的数据,得先知道第一组数据运算之后的结果,才能让后2组数据与之比较,来判断谁更小。如果这一道题要是选最大的数据,那么可能好算一些,直接算第一个的结果作为初始数据比较就好了。因为要选最小的那个,我的初始值没法儿设置(后来才想到把初始值设为最大就可以直接循环算3组数据了),尝试改动了一下没有成功后,我就想着,先单独算第一组数据,然后让剩下的2组循环,然后就尝试着改,最重要的是在这个过程中明白了调试的重要性,初步认识了调试,调试! 我在写的过程中发现程序没有按照我设计的走,后来百度调试方法,好不容易才出现那个一句一句执行,看每一次变量的值的变化的那个页面。直到今天上午才全部通过测试。期间也想着看一下题解,不过还是坚持自己写了。我写的过程中,以单个包装的数量是否大于人数为判断写了一个分支,基本上把整个程序分为了2部分,再加上是边循环边计算,所以代码循环分支嵌套比较严重,这也可能是我调试了很久的原因吧,不过后来还好自主写出来了,一共50多行,这应该是我自己思考写过的行数最多的代码了吧,不过从另一个角度来看这也没什么好骄傲的,只能说明我写的比较复杂。我提交成功之后看大家的题解,真的比我的简单太多,于是又尝试着改进了一下,这一次没有花费多少时间就成功了,在第二次中学会了 convert Boolean into int in java. 然后就是谷歌搜索不是经常能匹配到stackoverflow的结果,有问题还是要多去sf里面查。如果我中途看了题解,很可能就不能按照我的思路写出来这个复杂一些的代码。第一次提交成功后发现要比其他用c c++写出来的多用很多时间,内存占用也比较高。然后又参考别人的思路写了第二次,这个思路没有判断包装内铅笔的数量是否比人数多少,而是统一处理,所以就少了一次分支判断,感觉代码的优化就在于归一,把判断的情况尝试归到一类里面统一处理,这样就会让程序轻便。第二次代码的行数大约只有第一次代码的一半,可是提交测试的时间和内存跟第一次没啥差别,这可能就是Java的原因吧,也可能是我用了for循环的原因吧,可能不用会好一些。然后就是其实这道题一开始就想着用for循环来做,其实只有7个数,一个一个输入也可以的,这样就不用那么复杂的结构了。

总结一下,1.尝试自己动手写代码,用所学的知识点,不要只是看视频,动手!2.尽量的尝试做统一处理,尽量的归化特殊情况,避免分支,程序就会简单很多。3.convert boolean into int in java(下面代码会标出来).4.写上注释,这样自己的思路也会清晰很多。

第一次提交的代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
	Scanner scan=new Scanner(System.in);
	int number=0;	//学生人数
	int amount=0;	//铅笔数量
	int price=0;	//铅笔价格
	int cost=0;		//总花费
	int quantity=1;		//购买袋数
	int newcost=0;		//每读入一种包装,更新的价格
	int aamount=0;
	int bamount=0;
	number=scan.nextInt();
	amount=scan.nextInt();	//读入第一种包装信息
	price=scan.nextInt();
	
	if(amount>=number){
		newcost=price;	
		}else{
			aamount =amount;
			while(amount<number){				
				amount=amount+aamount;
				quantity=quantity+1;
				}
		newcost=quantity*price;
	}
	for(int i=0;i<=1;i++){			//循环读入后2种包装的信息
		amount=scan.nextInt();
		price=scan.nextInt();
		 cost=0;		
		 quantity=1;	
		if(amount>=number){
			cost=price;
			if(cost<newcost){
				newcost=cost;
			}
		}else{
			bamount=amount;
			while(amount<number){
				amount = amount+bamount;
				quantity=quantity+1;
			}
			cost=quantity*price;
			if(cost<newcost){
				newcost=cost;
			}
		}		
	}
	System.out.println(newcost);		//输出结果
}}


第二次提交的代码,

import java.util.Scanner;

public class Main {
public static void main(String[] args){
	Scanner scan = new Scanner(System.in);
	int number,amount,price,cost = 0;	//定义 人数,数量,价格,花费
	int newcost=2147483647;					//定义最终花费,赋初值为最大
	number=scan.nextInt();
	for(int i=0;i<=2;i++){		//循环读入3种包装规格
		amount=scan.nextInt();
		price=scan.nextInt();
		boolean myboolean=(number%amount!=0);		//这2行代码将boolean转变为int
		int myint=myboolean?1:0;
		cost=(number/amount+myint)*price;
	
	if(cost<newcost){	//判断花费是否更低
		newcost=cost;
	}
	}
	System.out.println(newcost);		//输出结果
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值