记录在洛谷练习算法

小玉家的电费

夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。

(我觉得递归似乎优雅一点哈哈哈哈哈)

	
	public static double f(float n){
		if (n==0) {
			return 0;
		}else if (n<=150) {
			return  (0.4463+f(n-1));
		}else if (n>150 && n<=400) {
			return  (0.4663+f(n-1));
		}else if (n>400) {
			return  (0.5663+f(n-1));
		}
		return 0;
		
	}

津津的储蓄计划

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下33元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

整体流程其实挺简单的,扣除每日零花钱后如果大于100就把除了零头的都存进他妈那儿,然后自己拿零头,最后算上利息。

实际上我因为两个问题导致耽误了很久时间:

其一是在判断是否超出预算的时候直接跳出循环,导致后面不再输出..最终得分60。然后就是没有想到,有可能会有>1月超出预算.. 如果这样那么舒服的月份不会是第一个月,而是第二个月,最终得分85,最后添加一个判断x是否没有被赋值才总算AC 。

总的来说,都是粗心大意和没有仔细观察题目惹的祸,后面希望自己能改掉这个毛病!

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int Surplus = 0;
		int Bank = 0;
		int x=0;
		for(int i=1;i<=12;i++){			
			int a = sc.nextInt();
			Surplus+=300-a;
			if (Surplus<0 && x==0) {
				x=i;				
			}else if(Surplus>=100){
				Bank+=Surplus/100;
				Surplus=Surplus%100;
			}
//			System.out.println("Bank"+Bank);
//			System.out.println("Surplus"+Surplus%100);
		}
		if (x!=0) {
			System.out.println("-"+x);
		}else {
			System.out.println((int)(Bank*120 + Surplus));			
		}
	}
}

买铅笔

P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。

商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物。

现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。

第一行包含一个正整数n,表示需要的铅笔数量。

接下来三行,每行用2个正整数描述一种包装的铅笔:其中第1个整数表示这种 包装内铅笔的数量,第2个整数表示这种包装的价格。

保证所有的7个数都是不超过10000的正整数。


闲的没事再开一题。这一题只需要计算哪一种铅笔在数量只需多不许少的情况下看那个价格比较便宜,很简单。

最终得分85,看了半天不知哪个地方没有考虑到,不过该章节任务已经完成了,过过过!

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int nx=100000;
		int n=sc.nextInt();
		for (int i = 0; i <3; i++) {			
			int Number=sc.nextInt();
			int Money=sc.nextInt();
			int nf=f(n,Number,Money);
			
			if (nf<nx) {
				nx=nf;
			}
			
		}
		System.out.println(nx);	
		
	
	}
	public static int f(int n,int num,int money){
		int xn=n/num;
		if (n%num!=0) {
			xn++;
		}
		return xn*money;
	}
	
}

三连击

将1,2,⋯,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。

大概意思就是输出一组 192 384 576(192 192x2 192x3),这样的数字而这些数字必须按照比例,并且包含123456789九个数字。所以似乎直接循环然后判断是否满足条件就ok。

通过该题本身要输出的数字看,最大是999,而为了满足1:2:3的比例,第一位最大是333,而为了满足包含九个数的定义,直接按照123-329进行循环即可。之后通过contains()函数判断是否存在。


public class Main {
	public static void main(String[] args) {
		
		for (int i = 123; i <329; i++) {
			if (!String.valueOf(i).contains("0")) {
				int a=i;
				int b=i*2;
				int c=i*3;
				if (f(a,b,c)) {
					System.out.println(a+" "+b+" "+c);
				}
				
			}
		}
		
		
	}
	public static boolean f(int a,int b,int c){
		String str=String.valueOf(a)+String.valueOf(b)+String.valueOf(c);
		if (str.contains("1")&&str.contains("2")&&str.contains("3")
				&&str.contains("4")&&str.contains("5")&&str.contains("6")
				&&str.contains("7")&&str.contains("8")&&str.contains("9")) {
			return true;
		}else {
			return false;
		}
		
	}
}

级数求和

已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。

现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。

基本上就是1/n(n>1)循环到大于K.. 这题似乎有点水,不过我喜欢,正好今天也懒得思考。任务完成,打游戏!

import java.util.Scanner;


public class Main {

	public static void main(String[] args) {
		
		
		Scanner sc=new  Scanner(System.in);
		int k=sc.nextInt();
		int n=0;
		double nx=0;
		while (nx<k) {
			n++;
			nx+=(double)1/n;
			
		}
		System.out.println(n);
		
		
	}

	
}

# 算法