洛谷菜鸟记录

算算算

洛谷

Day1 P1909 [NOIP2016 普及组] 买铅笔

题目描述

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

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

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

输入格式

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

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

保证所有的 77 个数都是不超过 1000010000 的正整数。

输出格式

1 个整数,表示 P 老师最少需要花费的钱。

简单的数学思路 虽然我数学也不是很好就是了 笑

import java.util.Arrays;
import java.util.Scanner;

public class Main{
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		int required = scanner.nextInt();//required表示需要的铅笔数量
		/**
		 * a存储两个整数
		 * 其中第1个整数表示这种包装内铅笔的数量
		 * 第2个整数表示这种包装的价格
		 * 一共3行,2列
		 */
		int a[][] = new int[3][2];
		int sum[] = new int[3];//sum表示P老师需要购买多少件当前包装类型的铅笔
		int c[] = new int[3];//c表示P老师购买之后的总价格
		for (int i = 0; i < 3; i++) {
			a[i][0] = scanner.nextInt();
			a[i][1] = scanner.nextInt();// 输入对应的价格
			
			if (required % a[i][0] != 0) {
				sum[i] = (required / a[i][0]) + 1;
			} else {
				sum[i] = required / a[i][0];
			}
			c[i] = sum[i] * a[i][1];
		}
		Arrays.sort(c);//将3行数据排序按照从小到大
		System.out.println(c[0]);//取最小的
		scanner.close();
	}
}
Day2 P1089 [NOIP2004 提高组] 津津的储蓄计划

题目描述

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

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

例如 1111月初津津手中还有 8383 元,妈妈给了津津 300300 元。津津预计1111月的花销是 180180 元,那么她就会在妈妈那里存 200200 元,自己留下 183183 元。到了 1111 月月末,津津手中会剩下 33 元钱。

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

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

输入格式

1212 行数据,每行包含一个小于 350350 的非负整数,分别表示 11 月到 1212 月津津的预算。

输出格式

一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 -X*,- X* 表示出现这种情况的第一个月;否则输出到 20042004 年年末津津手中会有多少钱。

注意,洛谷不需要进行文件输入输出,而是标准输入输出。

注意for循环i从1开始(12个月)

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int flag = 1;//标记
        int cost = 0;//花费
        int value = 0;//存在妈妈那的钱
        int money = 0;//自己的总钱
        int deadm = 0;//透支月份
        for(int i = 1; i < 13; i++){
            money += 300;
            cost = scanner.nextInt();
            money -= cost;
            if(money < 0){
                flag = 0;
                deadm = i;
                break;
            }
            value += money/100;//存在妈妈手里100的个数
            money %= 100;//剩余的钱
        }
        if(flag == 1){
            money += value * 100 * 1.2;
            System.out.println(money);
        }else{
            System.out.println(-deadm);
        }
        scanner.close();
    }
}
Day3 P1085 [NOIP2004 普及组] 不高兴的津津

很简单的一道 注意代码风格 不然编译不予通过 (怪)

import java.util.Scanner;

public class Main {
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		/*
		 a,b分别代表分别表示津津在学校上课的时间和妈妈安排她上课的时间
		 sum表示一天之内学习的时间总数
		 */
		int a,b,sum = 0,max = 0,day = 0;
		for (int i = 1; i < 8; i++) {
			a = scanner.nextInt();
			b = scanner.nextInt();
			sum = a+b;
			if(sum>max && sum>8) {//在超过8小时且比之前几天都大的sum,将sum赋给最大值,并记录下津津的这天是哪一天
				max = sum;
				day = i;
			}
		}
		System.out.println(day);//由于day初始化值为0所以如果津津没有不高兴的一天就直接输出0
		scanner.close();
	}
}

Day 4P1035 [NOIP2002 普及组] 级数求和

题目描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入格式

一个正整数 k*。

输出格式

一个正整数 n

输入输出样例

输入 #1复制

1

输出 #1复制

2

很简单的求和

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);

		int k = in.nextInt();
		double sn = 0;
		double n = 1;
		boolean flag = true;
		while (flag) {

			sn = sn + 1 / n;
			if (sn > k) {
				System.out.println((int) n);
				flag = false;
			}
			n++;
		}
	}
}
Day4 P1980 [NOIP2013 普及组] 计数问题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

字符串分割

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int count=0;
        for (int i = 1; i <= a; i++) {
            String[] str = (i + "").split("");//注意
            for (int j = 0; j < str.length; j++) {
                if (str[j].equals(String.valueOf(b))){//注意字符串不能和数字比
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

bug:编译失败

import java.util.Scanner;

/**
 * @Author SouthWind
 * @Date 2021/6/25 17:59
 */

public class count {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();   //右区间
        int x = sc.nextInt();
        int a,b,sum = 0;

        for(int i = 1; i<n+1; i ++){
            a = i;  //给循环的i 一个中转站
            while(a != 0){  //当每一位都验证过后 a 变成0,自然就跳出循环
                b = a % 10; //只取a个位上的数字
                a = a / 10; //当他是多位数,让他去掉个位,即让十位变个位
                if(b == x){ //看看此时a位置上的数字是否符合要求
                    sum++;    //符合则统计加1
                }
            }
        }
        System.out.println(sum);
    }
}
Day 5 P1014 [NOIP1999 普及组] Cantor 表
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int in = sc.nextInt();
        int i = 1;
        while (in > i) {
            in = in - i;
            i++;
        }
//        System.out.println(i);      //第几行
//        System.out.println(in);     //第几个
        int fz = 0, fm = 0;        //定义分子和分母
        if (i % 2 == 1) {         //奇数行,自左下到右上
            fz = i + 1 - in;
            fm = in;
        }else{                    //偶数行,自右上到左下
            fz=in;
            fm=i+1-in;
        }
        System.out.println(fz + "/" + fm);
    }
}
Day6 P1307 数字反转

熟悉java基本语法 对自负床相关属于发熟悉掌握

import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int a = scanner.nextInt();//输入一个数字
		int count = 0;//计数器
		while(a%10==0) {//将输入的数字后面的0都去掉,如380去掉之后变成38/38000去掉之后编程38等。
			a = a/10;
		}
		//如果是负数将其变成整数,再设置计数器已备后面使用
		if(a<0) {
			a = -a;
			count++;
		}
		//将数字装换成字符串
		String str = String.valueOf(a);
		//倒着输出
		for (int i = str.length()-1; i >= 0; i--) {
			//判断如果是负数则多输出一个'-'
			if(count==1 && i==str.length()-1) {
				System.out.print("-"+str.charAt(i));
			}else{
				System.out.print(str.charAt(i));
			}
		}
		scanner.close();
	}

}
Day 7 P1046 [NOIP2005 普及组] 陶陶摘苹果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
       int[] k = new int[10];
        Scanner sc = new Scanner(System.in);
        for(int i = 0;i < 10; i++){
            int Ah = sc.nextInt();
            k[i] = Ah;
        }
        int Ph = sc.nextInt() + 30;
        //int Touch = Ph + 30;
        int count = 0;
        for(int i = 0;i < 10;i++){
            if(K[i] <= Ph){
                count++;
            }
        }
        System.out.println(count);
    }
}
Day 8 P1047 [NOIP2005 普及组] 校门外的树

桶排序

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner (System.in);
		//L代表马路的长度,M代表区域的数目
		int l = sc.nextInt();
		int m = sc.nextInt();
		//建立一个数组当做这一条路,初始化默认为0
		int t[] = new int [10005];
		//sum统计
		int sum = 0;
		for(int i=0; i<m; i++) {
			//表示一个区域的起始点和终止点的坐标。
			int n1 = sc.nextInt();
			int n2 = sc.nextInt();
			//循环遍历
			for(int j=n1; j<=n2; j++) {
				if(t[j]==0) {	//如果这个位置有树
					t[j]=1;		//赋值为1 
				}
			}
		}
		//再次循环遍历,统计数组为0的个数
		for(int i=0; i<=l; i++) {
			if(t[i]==0) {
				sum++;
			}
		}
		System.out.println(sum);
	}

}
Day 8P1427 小鱼的数字游戏

陷阱
末尾0的位置 可能中甲出现0位置 所以不可理想化中间数字不出现0
错误代码

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int[] k = new int[10001];
        for(int i = 0;i < k.length; i++){
            k[i] = sc.nextInt();
        }
        for(int j = k.length-1; j >= 0; j--){
            if(k[j]!=0){
            System.out.print(k[j]+" ");        
            }
        }
    }
}

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int[] k = new int[10001];
        int flag = 0;
        for(int i = 0;i < k.length; i++){
            k[i] = sc.nextInt();
            if(k[i] == 0){
                flag = i;
                i = k.length;
            }
        }
        for(int j = flag - 1; j >= 0; j--){
            System.out.print(k[j]+" ");        
        }
    }
}
Day8 P2141 [NOIP2014 普及组] 珠心算测验

三层for循环遍历相加 遍历数组中的元素 两两相加之和是否为数组中某一个数字

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0;i < arr.length;i++){
            arr[i] = sc.nextInt();
        }
        int flag = 0;
        for(int k = arr.length-1;k >= 0;k--){
            for(int i = arr.length-1;i >= 0;i--){
                 for(int j = arr.length-1;j>= 0;j--){
                     if(arr[k] == arr[i] + arr[j] && i!=j){
                        flag++;
                         i = -1;
                         j = -1;
                     }
                 }
            }
        }
        System.out.println(flag);
    }
}
Day 8 P5594 【XR-4】模拟赛

题目提示二维数组

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n= scanner.nextInt();
        int m= scanner.nextInt();
        int k= scanner.nextInt();
        int a[][]=new int[1001][1001];
        for(int i=1;i<=n;i++){
            for(int l=1;l<=m;l++){
                int day= scanner.nextInt();
                a[day][l]=1;
            }
        }
        for(int i=1;i<=k;i++){
            int sum=0;
            for(int l=1;l<=m;l++){
                if(a[i][l]==1){
                    sum++;
                }
            }
            System.out.print(sum+" ");
        }
    }
}
Day 8P1055 [NOIP2008 普及组] ISBN 号码

注意情况分析

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        char[] ch=null;
        char [] ch1=new char[13];
        int sum=0;
        int k=0;
        Scanner sc = new Scanner(System.in);
        String s1=sc.nextLine();
        ch=s1.toCharArray();
        for (int i=0;i<ch.length;i++){
            if ((ch[i]>='a'&& ch[i]<='z')||(ch[i]>='A'&& ch[i]<='Z')||ch[i]>='0' && ch[i]<='9'){
                ch1[k++]=ch[i];
            }
        }
        for (int i=0;i<k-1;i++){
           sum=sum+Character.getNumericValue(ch1[i])*(i+1);
       }
        char c='X';
       int target=Character.getNumericValue(ch[ch.length-1]);
       if (sum%11==target||(sum%11==10 && ch[ch.length-1]==c)){
           System.out.print("Right");
       }else if ((sum%11)==10){

           ch[ch.length-1]=c;
           System.out.print(ch);
       }
       else {
           int a=sum%11;
           char b= (char) (a+48);
           ch[ch.length-1]=b;
           System.out.print(ch);
    }
 }
}

Day 8 P1308 [NOIP2011 普及组] 统计单词数

Scanner.next()与Scanner.nextLine()的区别
1、next()方法在遇到有效字符前所遇到的空格、tab键、enter键都不能当作结束符,next()方法会自动将其去掉,只有当next()方法遇到有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符,所以next()不能得到带有空格的字符串,只能得到部分字符串(空格前面的)。

2、nextLine()方法的结束符是Enter键,即nextLine()方法返回的是Enter键之前的所有字符串,所以nextLine()方法可以获取到带有空格的字符串。

equalsIgnoreCase()和equals()的区别
String a=“ABC”;
a.equals(“abc”)为false,
a.equalsIgnoreCase(“abc”)为true;
equalsIgnoreCase与equals区别是前者不区分大小写,而后者区分

equals() 会判断大小写区别,equalsIgnoreCase() 不会判断大小写区别

import java.util.Scanner;
public class Main{

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String word = scanner.nextLine();//这里同下
        String text = scanner.nextLine();//重点,如果写成scanner.next()就会错误,因为只有nextLine()可以输入像空格、回车一样的字符
        String[] datas = text.split(" ");//用分割函数将分割之后的串存到datas数组中
        int count = 0;// 计数器
        boolean flag = false;
        int location = 0;// 表示在文章中第一次出现时,单词首字母在文章中的位置
        for (int i = 0; i < datas.length; i++) {
            if (datas[i].equalsIgnoreCase(word)) {
                count++;
            } else {
                if (!flag) { // 如果已经出现了第一个单词,就不要再继续了
                    location +=  datas[i].length() + 1; // 如果遍历的单词不是,就把位置加好 遍历当前数组数
                }
            }
            //判断,计算位置,想测试的话可以把下面的注释打开
            if (count == 1) {
                flag = true;
            }
        }
        if (count == 0) {
            //如果单词在文章中没有出现,则直接输出一个整数-1
            System.out.println(-1);
        } else {
            System.out.println(count + " " + location);
        }
        scanner.close();
    }
}

Day 8 回文日期

注意学会单独判断特殊情况 是否可以简化为一般情况 倒推

import java.util.Scanner;

public class P2010NOIP2016普及组回文日期 {

	static int d[]= {0,31,29,31,30,31,30,31,31,30,31,30,31},ans;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int d1=in.nextInt();
		int d2=in.nextInt();
		for (int i=1;i<=12;i++) {
			for (int j=1;j<=d[i];j++) {
				int r=(j%10)*1000+(j/10)*100+(i%10)*10+i/10;//前四位数
				int sum=r*10000+i*100+j;	//算出回文数
				if (sum<d1||sum>d2) continue;
				ans++;
			}
		}
		System.out.println(ans);
	}

}
    scanner.close();
}

}


Day 8 回文日期

注意学会单独判断特殊情况 是否可以简化为一般情况 倒推

```java
import java.util.Scanner;

public class P2010NOIP2016普及组回文日期 {

	static int d[]= {0,31,29,31,30,31,30,31,31,30,31,30,31},ans;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int d1=in.nextInt();
		int d2=in.nextInt();
		for (int i=1;i<=12;i++) {
			for (int j=1;j<=d[i];j++) {
				int r=(j%10)*1000+(j/10)*100+(i%10)*10+i/10;//前四位数
				int sum=r*10000+i*100+j;	//算出回文数
				if (sum<d1||sum>d2) continue;
				ans++;
			}
		}
		System.out.println(ans);
	}

}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值