模拟、枚举专题(完结)

成绩分析问题_m0_59519985的博客-CSDN博客

饮料换购问题_m0_59519985的博客-CSDN博客

刷题统计(注意类型)_m0_59519985的博客-CSDN博客

天干地支(Java)_m0_59519985的博客-CSDN博客

递增序列:

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 4545 度的斜线上,这两个字母从左向右看、或者从上向下看是递增的。

例如,如下矩阵中

LANN
QIAO

有LN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、ANLN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、AN 等 1313 个 递增序列。注意当两个字母是从左下到右上排列时,从左向右看和从上向下看 是不同的顺序。

对于下面的 3030 行 5050 列的矩阵,请问总共有多少个递增序列?

VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG
SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF
ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA
BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL
YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH
ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU
XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR
ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG
MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA
VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF
GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC
EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK
PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW
CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP
RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS
PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR
JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL
YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP
HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN
DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF
LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW
CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ
IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI
ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB
HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP
FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS
VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ
BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR
RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY
ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
import java.util.*;
public class 递增序列 {
	public static void main(String[] args) {
		int[][] a= {{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
		Scanner scan=new Scanner(System.in);
		char[][] str=new char[30][50];
		for(int i=0;i<30;i++) {
			str[i]=scan.nextLine().toCharArray();
		}
		scan.close();
		long sum=0;
		for(int i=0;i<30;i++) {
			for(int j=0;j<50;j++) {
				char t=str[i][j];
				for(int k=0;k<8;k++) {											//必须往一个方向上延伸
					for(int x=i+a[k][0],y=j+a[k][1];x>=0&&x<30&&y>=0&&y<50;x+=a[k][0],y+=a[k][1]) {
//						System.out.println(x+" "+i+" "+y+" "+j);
										//从左向右看,从上往下看
						if(t<str[x][y]&&(x>i||y>j)) {
							sum++;
						}
					}
				}
			}
		}
		System.out.println(sum);
	}
}

扫雷:

题目描述

在一个 nn 行 mm 列的方格图上有一些位置有地雷,另外一些位置为空。

请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。

输入描述

输入的第一行包含两个整数 n,mn,m。

第 22 行到第 n+1n+1 行每行包含 mm 个整数,相邻整数之间用一个空格分隔。如果对应的整数为 00,表示这一格没有地雷。如果对应的整数为 11,表示这一格有地雷。

其中,1≤n,m≤1001≤n,m≤100 分钟后还是在当天。

输出描述

输出 nn 行,每行 mm 个整数,相邻整数之间用空格分隔。

对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出 99。

输入输出样例

示例 1

输入

3 4
0 1 0 0
1 0 1 0
0 0 1 0

输出

2 9 2 1
9 4 9 2
1 3 9 2

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
import java.util.Scanner;
public class 地雷{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n=scan.nextInt();
        int m=scan.nextInt();
        int[][] a=new int[n+2][m+2];
        for(int i=1;i<=n;i++) {
        	for(int j=1;j<=m;j++) {
            	a[i][j]=scan.nextInt();
            }
        }
        int[][] b=new int[n+1][m+1];
        scan.close();
        int[][] t= {{0,1},{1,0},{-1,0},{0,-1},{1,1},{-1,-1},{-1,1},{1,-1}};
        for(int i=1;i<n+1;i++) {
        	for(int j=1;j<m+1;j++) {
            	if(a[i][j]==1) {
            		b[i][j]=9;
            	}else {
            		int sum=0;
                	for(int k=0;k<8;k++) {
                		int tx=i+t[k][0];
                		int ty=j+t[k][1];
                			if(a[tx][ty]==1) {
                                sum++;
                              }           				   	
                	}
                	b[i][j]=sum;
            	}
            }
        }
        for(int i=1;i<=n;i++) {
        	for(int j=1;j<=m;j++) {
            	System.out.print(b[i][j]+" ");
            }
        	System.out.println();
        }  
    }
}

含2天数:

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝特别喜欢 22,今年是公元 20202020 年,他特别高兴,因为每天日历上都可以看到 22。

如果日历中只显示年月日,请问从公元 19001900 年 11 月 11 日到公元 99999999 年 1212 月 3131 日,一共有多少天日历上包含 22。即有多少天中年月日的数位中包含数字 22。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
 public static boolean find(int y) {
		if((y%4==0&&y%100!=0)||y%400==0) {
			return true;
		}else {
			return false;
		}
		
	}
	public static void main(String[] args) {
		long sum=0;
		for(int y=1900;y<=9999;y++) {
			int yy=y,flag=0;
			while(yy!=0) {
				if(yy%10==2) {
					flag=1;
					break;
				}
				yy/=10;
			}
			if(flag==1&&find(y)) {
				sum+=366;
			}else if(flag==1&&!find(y)){
				sum+=365;
			}else if(flag==0&&find(y)){
				sum+=180;
			}else if(flag==0&&!find(y)){
				sum+=179;
			}
		}
		System.out.print(sum);
	}
}

单词分析:

题目描述

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。

输入描述

输入一行包含一个单词,单词只由小写英文字母组成。

对于所有的评测用例,输入的单词长度不超过 1000。

输出描述

输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。

第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

输入输出样例

示例 1

输入

lanqiao

输出

a
2

示例 2

输入

longlonglongistoolong

输出

o
6

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
   public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		String str=scan.nextLine();
		scan.close();
		int[] a=new int[26];
		for(int i=0;i<str.length();i++) {
			a[str.charAt(i)-'a']++;
		}
		int b=a[0];
		for(int i=0;i<26;i++) {
			if(b<a[i]) {
				b=a[i];
			}
		}
		for(int i=0;i<26;i++) {
			if(b==a[i]) {
				System.out.println((char) (i+'a'));
				System.out.println(a[i]);
				break;
			}
		}
	}
}

门牌号制作:

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝要为一条街的住户制作门牌号。

这条街一共有 20202020 位住户,门牌号从 11 到 20202020 编号。

小蓝制作门牌的方法是先制作 00 到 99 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、71、0、1、7,即需要 11 个字符 00,22 个字符 11,11 个字符 77。

请问要制作所有的 11 到 20202020 号门牌,总共需要多少个字符 22?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
     public static void main(String[] args) {
    	int sum=0;
        for(int i=1;i<2021;i++) {
        	int x=i;
        	while(x!=0) {
        		if(x%10==2) {
        			sum++;
        		}
        		x/=10;
        	}
        }
        System.out.println(sum);
    }
}

特别数的和:

题目描述

小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

请问,在 1 到 nn 中,所有这样的数的和是多少?

输入描述

输入一行包含一个整数 n(1≤n≤104)n(1≤n≤104)。

输出描述

输出一行,包含一个整数,表示满足条件的数的和。

输入输出样例

示例

输入

40

输出

574

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n=scan.nextInt();
        scan.close();
        int sum=0;
        for(int i=1;i<=n;i++){
          int x=i;
          while(x!=0){
            int c=x%10;
            if(c==2||c==0||c==9||c==1){
              sum+=i;
              break;
            }
            x=x/10;
          }
        }
        System.out.println(sum);
    }
}

为防止结果可能过大,可以改为long型

跑步锻炼:

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(11 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。

小蓝跑步已经坚持了很长时间,从 20002000 年 11 月 11 日周六(含)到 20202020 年 1010 月 11 日周四(含)。请问这段时间小蓝总共跑步多少千米?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
import java.util.*;
public class 跑步锻炼{
	public static boolean find(int i) {
		if(i%400==0||i%4==0&&i%100!=0) {
			return true;
		}else {
			return false;
		}
	}
    public static void main(String[] args) {
    	int[] m= {31,28,31,30,31,30,31,31,30,31,30,31};
    	int sum=0,week=6;
    	for(int i=2000;i<=2020;i++) {
    		if(find(i)) {
    			m[1]=29;
    		}else {
    			m[1]=28;
    		}
    		for(int j=0;j<12;j++) {
    			for(int k=1;k<=m[j];k++) {
    				if(k==1||week==1) {
    					sum+=2;
    				}else {
    					sum++;
    				}
    				week=(week+1)%7;
    				if(i==2020&&j==9&&k==1){
    		              System.out.println(sum);
    		              return;
    	            }
    			}
    		}
    	}
    }
}

使用Java自带的API处理时间:

import java.util.Calendar;
public class 跑步锻炼2{
    public static void main(String[] args) {
    	Calendar start=Calendar.getInstance();
    	start.set(2000,0,1);
    	Calendar end =Calendar.getInstance();
    	end.set(2020, 9,1);
    	int sum=0;
    	while(start.compareTo(end)<=0) {
    		//  Day_OF_WEEK==2是表示周一,1是周日
    		if(start.get(Calendar.DAY_OF_MONTH)==1||start.get(Calendar.DAY_OF_WEEK)==2) {
    			sum+=2;
    		}else {
    			sum++;
    		}
    		start.add(Calendar.DATE, 1);	//增加一天
    	}
    	System.out.println(sum);
    }
}

时间显示:

题目描述

小蓝要和朋友合作开发一个时间显示的网站。

在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 19701970 年 11 月 11 日 00:00:0000:00:00 到当前时刻经过的毫秒数。

现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。

给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

输入描述

输入一行包含一个整数,表示时间。

输出描述

输出时分秒表示的当前时间,格式形如 HH:MM:SS,其中 HH 表示时,值为 00​​​​ 到 2323​​​​,MM 表示分,值为 00​​​​ 到 5959​​​,SS 表示秒,值为 00​​ 到 5959​。时、分、秒 不足两位时补前导 00。

输入输出样例

示例 1

输入

46800999

输出

13:00:00

示例 2

输入

1618708103123

输出

01:08:23

评测用例规模与约定

对于所有评测用例,给定的时间为不超过 10181018 的正整数。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M
import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.sql.Date;
public class 时间显示{
    public static void main(String[] args) {
//    	使用Calendar类
//        Scanner scan = new Scanner(System.in);
//        int time=scan.nextInt();
//        scan.close();
//        Calendar ca=Calendar.getInstance();
//        ca.set(1970, 1, 1, 00, 00, 00);
//        ca.add(Calendar.SECOND, time/1000);
//        int shi=ca.get(Calendar.HOUR_OF_DAY);
//        int fen=ca.get(Calendar.MINUTE);
//        int miao=ca.get(Calendar.SECOND);
//        System.out.printf("%02d:%02d:%02d\n",shi,fen,miao);
//      用数学运算
//        Scanner scan = new Scanner(System.in);
//        long time=scan.nextLong();
//        scan.close();
//        time/=1000;
//        time%=(24*60*60);
//        System.out.printf("%02d:%02d:%02d\n",time/3600,(time/60)%60,time%60);
//        Scanner scan = new Scanner(System.in);
    	
//    	题目是从1970 01-01;00:00:00开始,date是从1970 01-01;08:00:00
        Scanner scan = new Scanner(System.in);
        long time=scan.nextLong();
        scan.close();
        Date d=new Date(time-8*60*60*1000);
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        System.out.println(sdf.format(d));
    }
}

数列求值:

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

给定数列 1,1,1,3,5,9,17,⋯1,1,1,3,5,9,17,⋯,从第 44 项开始,每项都是前 33 项的和。

求第 2019032420190324 项的最后 44 位数字。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
import java.util.Scanner;
public class 数列求值{
	public static void main(String[] args) {
		int a=1;
		int b=1;
		int c=1;
		int d = 0;
		for(int i=4;i<20190325;i++) {
			d=(a+b+c)%10000;
			a=b;
			b=c;
			c=d;
		}
		System.out.println(d);
	}
}

猜生日:

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

今年的植树节(2012 年 3 月 12 日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!”

“把我出生的年月日连起来拼成一个 8位数(月、日不足两位前补 0)正好可以被今天的年、月、日整除!”

他想了想,又补充到:“再给个提示,我是 6 月出生的。”

根据这些信息,请你帮小明算一下,他叔叔的出生年月日。

格式是年月日连成的 8位数。例如,如果是 1948 年 6月 12 日,就写:19480612。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
import java.util.*;
public class 猜生日 {
	public static void main(String[] args) {
		for(int i=2012*3;i<20120312;i+=2012*3) {
			int m=(i/100)%10;
			int mm=(i/1000)%10;
			int day=i%100;
			if(m==6&&day<=30&&mm==0) {
				System.out.println(i);
			}
		}
	}
}

结果应该为:19550604

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

请你找到最小的整数 XX 同时满足:

  1. XX 是 20192019 的整倍数;
  2. XX 的每一位数字都是奇数。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
		// int flag=0;
		// long x=2019;
		// while(flag==0) {
		// 	long i=x;
		// 	flag=1;
		// 	while(i!=0) {
		// 		int s=0;
		// 		if((i%10)%2==0) {
		// 			flag=0;
		// 			break;
		// 		}else {
		// 			flag=flag&1;
		// 		}
		// 		i/=10;
		// 	}
		// 	if(flag==1) {
		// 		System.out.println(x);
		// 		break;
		// 	}
		// 	x+=2019;
		// }
    System.out.println("139311");
	}
}

问题描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。

例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。

小明想知道在整个 2022 年份中,一共有多少个顺子日期?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

T5,顺子日期_m0_59519985的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值