输入
一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
输入
输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。
样例输入
02/03/04
样例输出
2002-03-04
2004-02-03
2004-03-02
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; public class num07 { public static String str; public static String str1[]; public static Queue<nian>queue1=new PriorityQueue<>(); public static List<nian>list=new ArrayList<>(); public static DecimalFormat df=new DecimalFormat("00");设置格式,月份以及天数 public static void swap(int i,int j) { String string=str1[i]; str1[i]=str1[j]; str1[j]=string; } public static boolean panduan1 (int year)//判断是否是闰年 { if((year%4==0 && year%100!=0)||(year%400==0)) return true; else { return false; } } public static boolean panduan(int year,int month,int day)//判断安排的年份是否符合事实,首先最简单的就是除2月份以外的月份,毕竟只有2月的天数是存在变化的 //这里就是主要考察闰月的相关操作 { if(month>12||month<1) return false; if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) { if(day>31||day<1) return false; } else if(month==4||month==6||month==9||month==11){ if(day>30||day<1) return false; } else { if(panduan1(year)) { if (day>29||day<1) { return false; } } else { if(day>28||day<1) return false; } } return true; } public static void fullsort(int i)//将给出的数据进行全排列,排列完之后进行筛选 { if(i==str1.length) { String str2; if(Integer.parseInt(str1[0])>59) { str2="19"+str1[0]; } else str2="20"+str1[0]; int []num=new int [3]; num[0]=Integer.parseInt(str2); for(int k=1;k<3;k++) num[k]=Integer.parseInt(str1[k]); if(panduan(num[0], num[1], num[2])) list.add(new nian(num[0], num[1], num[2])); return ; } for(int j=i;j<str1.length;j++) { swap(i, j); fullsort(i+1); swap(i, j); } } public static void main(String[] args) { Scanner sc=new Scanner(System.in); str=sc.next(); str1=str.split("/"); queue1=new PriorityQueue<>(compare); fullsort(0); for(int i=0;i<list.size();i++) queue1.add(list.get(i)); int length=queue1.size(); for(int i=0;i<length;i++) { nian nian1=queue1.poll(); System.out.println(nian1.year+"-"+df.format(nian1.month)+"-"+df.format(nian1.day)); } } static Comparator<nian>compare=new Comparator<nian>() { @Override public int compare(nian o1, nian o2) { if(o1.year==o2.year) { if(o1.month==o2.month) { return o1.day-o2.day; } return o1.month-o2.month; } else return o1.year-o2.year; } }; static class nian//采用优先队列进行排序 { int year; int month; int day; public nian() { this.year=0; this.month=0; this.day=0; } public nian(int year,int month,int day) { this.year=year; this.month=month; this.day=day; } } }
第八题:
标题:包子凑数
小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。
每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。
当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼,分别能放4、5和6个包子。而顾客想买7个包子时,大叔就凑不出来了。
小明想知道一共有多少种数目是包子大叔凑不出来的。
输入
第一行包含一个整数N。(1 <= N <= 100)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100)
输出
一个整数代表答案。如果凑不出的数目有无限多个,输出INF。
例如,
输入:
2
4
5
程序应该输出:
6
再例如,
输入:
2
4
6
程序应该输出:
INF
样例解释:
对于样例1,凑不出的数目包括:1, 2, 3, 6, 7, 11。
对于样例2,所有奇数都凑不出来,所以有无限多个。
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
提交程序时,注意选择所期望的语言类型和编译器类型。
这道题目是关于数论的一道题目,主要考察互质的概念,互质的意思就是,两个数的最大公约数是1的,就称为互质
import java.util.Scanner; public class num08 { public static int panduan(int a,int b)//欧几里得算法求解两个数的最大公约数 { if(a<b) { int temp=a; a=b; b=temp; } if(b==0) return a; else return panduan(b, a%b); } public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int []num=new int [n]; num[0]=sc.nextInt(); int max=num[0]; for(int i=1;i<n;i++) { num[i]=sc.nextInt(); max=panduan(max, num[i]); } if(max!=1) System.out.println("INF"); else { boolean dp[]=new boolean [10010];//定义一个数组,用来排查所有不能组成的数,这里范围为10010的主要意思是假设最大的情况,有100个数,每个数在100上下波动,所以范围是10010 dp[0]=true; for(int i=0;i<n;i++) { for(int j=0;j+num[i]<10010;j++) { if(dp[j]) { dp[j+num[i]]=true; } } } int count=0; for(int i=0;i<10010;i++) { if(!dp[i]) count++; } System.out.println(count); } } }
第九题:
标题: 分巧克力
儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。 为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足: 1. 形状是正方形,边长是整数 2. 大小相同
例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么?
输入
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000)
输入保证每位小朋友至少能获得一块1x1的巧克力。
输出
输出切出的正方形巧克力最大可能的边长。
样例输入:
2 10
6 5
5 6
样例输出:
2
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
import java.util.Scanner; public class num09 { public static int n; public static int k; public static int []num1; public static int []num2; public static int figure(int j,int []num1,int []num2)计数在j边长下,总共能够分得的快数 { int count=0; for(int i=0;i<n;i++) { int i1=num1[i]/j; int i2=num2[i]/j; count+=i1*i2; } return count; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); n=sc.nextInt(); k=sc.nextInt(); num1=new int [n]; num2=new int [n]; int min=Integer.MAX_VALUE; for(int i=0;i<n;i++)//在输入数据的过程中,比较得出最小的那条边,因为最小的是正方形,所以,边长最大只可能是最短的那条边 { num1[i]=sc.nextInt(); num2[i]=sc.nextInt(); if(min>num1[i]) min=num1[i]; if(min>num2[i]) min=num2[i]; } int max=0; for(int i=min;i>0;i--)//进行循环操作,如果出现块数满足就跳出 { if(figure(i, num1, num2)>=k) { max=i; break; } } System.out.println(max); } }
第十题:
标题: k倍区间
给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
你能求出数列中总共有多少个K倍区间吗?
输入
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
输出
输出一个整数,代表K倍区间的数目。
例如,
输入:
5 2
1
2
3
4
5
程序应该输出:
6
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
import java.util.Scanner; public class num10 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int k=sc.nextInt(); int count=0; int []num=new int [n]; for(int i=0;i<n;i++) num[i]=sc.nextInt(); for(int i=1;i<n+1;i++) { for(int j=0;j+i-1<n;j++) { int sum=0; for(int k1=j;k1<j+i;k1++) { sum+=num[k1]; } if(sum%k==0) count++; } } System.out.println(count); } }
这里作者采用的是暴力求解,能做出来,所以感觉,很尴尬,毕竟一般采用暴力求解,很容易超时的,所以本人感觉有点尴尬。
作者很菜,如有不足,请指教!