🍋1.时间显示
小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取
了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时
刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要
显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
具体的输入输出可以在题目链接可看。
题目链接:时间显示https://www.lanqiao.cn/problems/1452/learning/
这是去年JavaB组省赛的第一道大题,有的人一看到就来一句——卧槽!这么难?从1970年开始那得有多少毫秒?算了算了先看下一题。但是大家要想一下? 题目求的是什么?是今天的时分秒!我们不需要去关心今天是多少年多少月多少日,所以我们有下面的这几步思考步骤:
设接收到的总毫秒数为n。
1.首先先n=n/1000。因为n的单位是毫秒,我们需要的最低精准单位是秒,而1s=1000ms,所以不足一秒的毫秒我们直接舍去,此时n的单位变成了秒
2.进行操作n=n%(60*60*24)。因为我们只关心今天走了的时间,也就是今天走了多少秒,我们对一整天的秒数进行取余,则获得的就是未满一天的秒数,也就是今天的
3.long hour=n/3600;因为我们已经获得了今天的秒数,1h=3600s,我们算出n可以整除出多少个3600,则就是多少个小时,由此得到了今天的小时数。
4.n%=3600;long month=n/60;我们先对n%3600是为了得到剩下未满一个小时的秒数,也就是分加上秒的,我们对n取余60,就能得到分钟的值。
5.n%=60; long s=n;同理于分,先取余60,剩下的n就是我们最后的秒数了。
代码转换:
import java.util.Scanner; public class 时间显示 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); long n=sc.nextLong(); //拿到的是毫秒,先转换为秒,1m等于1000ms n=n/1000; //现在拿到的是秒,对一天的秒数取余即可获得今天的秒数 n=n%(60*60*24); //现在拿到的是一天的秒数,开始转化为答案,一小时有3600秒,先获得秒 long hour=n/3600; //现在获得分钟加分 n%=3600; //再获得分钟 long month=n/60; //再获得秒 n%=60; long s=n; //这里涉及输出格式,大家可以学习一下printf的输出格式 System.out.printf("%02d:%02d:%02d",hour,month,s); } }
👑2.分巧克力
儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有 N 块巧克力,其中第 i 块是 Hi×Wi 的方格组成的长方形。为了公平起见,
小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克力需要满足:
形状是正方形,边长是整数;
大小相同;
例如一块 6x5 的巧克力可以切出 6 块 2x2 的巧克力或者 2 块 3x3 的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?
具体的输入输出可以在题目链接可看。
题目链接:分巧克力 https://www.lanqiao.cn/problems/99/learning/
首先对于一块Hi×Wi的巧克力,如果我们设切出的巧克力边长为n(题目要求必须是正方形),那么这块巧克力能切出我们符合要求的巧克力的块数为(Hi/n)×(Wi/n)。一个小破图给大家理解一下。
这个公式对于每块巧克力都是适用的。也就是说,当我们选定一个n,就可以计算出这一堆巧克力能切出多少块边长为n的巧克力。我们需要去找出最大的符合条件的n,很明显,我们需要引用到二分查找——去找到最大的符合条件的n,这里的符合条件是保证切出的块数大于等于K,也就是足够每个小朋友分到。
代码转换:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int N=sc.nextInt(); int K=sc.nextInt(); //用来存储每块巧克力的长和宽 int[][] arr=new int[N][2]; for(int i=0;i<N;++i) { arr[i][0]=sc.nextInt(); arr[i][1]=sc.nextInt(); } //r的值根据题目给的长和宽进行选择 int l=1; int r=100000; while(l<r) { int mid=(l+r+1)/2; //check满足说明切的块数足够分 if(check(arr,mid,K)) l=mid; else r=mid-1; } System.out.println(l); } //X越小块数越多,找出X的最大值 //判断以边长X来分,是否可以分够X块 static boolean check(int[][] arr,int X,int K) { int count=0; for(int i=0;i<arr.length;++i) { //这里计算能分多少块边长为X的巧克力 int ans=(arr[i][0]/X)*(arr[i][1]/X); count+=ans; } return count>=K; } }
🎅3.时间加法
现在时间是 a 点 b 分,请问 t 分钟后,是几点几分?
题目链接:时间加法https://www.lanqiao.cn/problems/548/learning/
具体的输入输出可以在题目链接可看。
这是今年一道简单的模拟赛题目,我们需要模拟时间的加法,这里需要完成分钟超过60后对小时进行进位,小时超过24小时后需要重置(也就是到达了第二天)
代码转换:
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 t=sc.nextInt(); //让分钟加上t b+=t; int ans=0; //如果分钟达到60,需要进位 if(b>=60) { //算出小时的增量 ans=b/60; //对60取余算出分钟 b%=60; } //小时加上增量 a+=ans; if(a>=24) { //如果小时超过24需要取余重置 a%=24; } System.out.println(a); System.out.println(b); } }