B.BM算日期
题意:
就是给定两个整数n,k,n是第一个日期,n+k是第二个日期,如果n+k>9999,那么9999 -(n+k-9999)是第二个日期,算这两个日期中有多少个闰年。
思路:
首先根据题目规则得到第二个日期,然后算他们之间的闰年数(包含这两个日期),能被4整除但不能被100整除或者能整除400的是闰年。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
while(T-->0) {
int a = scanner.nextInt();
int b = scanner.nextInt();
if(a+b>9999) {
int c = a+b-9999;
b = 9999-c;
}else {
b = a+b;
}
int count = 0;
if(a>b) {
int temp = a;
a = b;
b = temp;
}
for(int i = a;i <= b;i++) {
if(i%4==0&&i%100!=0||i%400==0) {
count++;
}
}
System.out.println(count);
}
}
}
D. Palindrome Hard Problem
题意:
最近 wifePie 学长在研究字符串难题,对回文问题颇有研究,经常一言不合就掏出回文树和马拉车,并且基于深度研究的基础上提出以下问题:
给出 n 个长度相同的,只包含小写字母的字符串,标号为 1 到 n。并且我们约定第 i 个字符串为 si。你可以进行不限次数的如下操作,每个操作都会使得字符串个数减 1:
把 si 拼接到 sj 的后面, 操作后 si 消失。
把 si 拼接到 sj 的前面, 操作后 si 消失。
将 si 和 sj 进行交错排列, 形成一个新的字符串 S。操作后 S 替代 sj 的位置,然后 si 和 sj 消失。(例如 "aaaa" 与 "bbbb" 重构后 得到的串为 "abababab")。
直接舍弃 si。
经过若干次上述操作后,你可以获得一个终极串,问这个终极串最多能分割成多少个回文串。
值得注意的是,上述操作是由你选择如何操作的,你要保证你最终得到的终极串能够分割出的回文串的数量是最多的。
思路:
将每个字母都单独分隔出来时就能得到分割出最多回文串的数量,所以直接将所有字母拼接起来就可以了。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String[] str = new String[n];
int sum = 0;
for(int i = 0;i < n;i++) {
str[i] = scanner.next();
sum += str[i].length();
}
System.out.println(sum);
}
}
E.BM 充饥
题意:
输入"kfc",输出kfc的图。
思路:
签到题,按题目输出即可。
H.Hsueh- Draw Progress
题意:
给出两个数,第一个是总量n,第二个是进度m,画出由#和-组成的进度条,#表示完成,-表示未完成,最后还要用百分数表示进度。# 的数量是m个,- 的数量是n-m个。
思路:
就是字符串拼接,这里用StringBuffer要比String快很多,用append方法拼接,然后将两个字符串按格式输出。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
while(T-->0) {
int n = scanner.nextInt();
int m = scanner.nextInt();
int a = n-m;
StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer();
for(int i = 1; i<=m;i++) {
s1.append("#");
}
for(int i = 1; i<=a;i++) {
s2.append("-");
}
String str1 = s1.toString();
String str2 = s2.toString();
int res = m*100/n;
System.out.println('['+str1+str2+"] "+res+'%');
}
}
}
I. BM 旅游
题目:
众所周知 bm 学姐喜欢旅游。这一天他来到了著名的杭师大景点勤园 13-406。该景点中有四个著名的观景台分为 A,B,C,D。
如果只去过上述一个观景台,输出 "Oh dear!!"(没有引号)。
如果去过两个,输出 "BaoBao is good!!"(没有引号)。
如果去过三个,输出 "Bao Bao is a SupEr man///!"(没有引号)。
如果全都去过,输出 "Oh my God!!!!!!!!!!!!!!!!!!!!!"(没有引号)。
如果一个都没去过,输出 "Bao Bao is so Zhai......"(没有引号)。
Input
第一行包含 4 个整数 A,B,C,D(0≤A,B,C,D≤1018)。
A 的每个位的数字和若大于等于 16 或者等于 6 则说明去过观景台 A。
B,C,D 亦如此。
Output
根据题干提示输出 5 种字符串之一。
思路:
可以将该数的每一位都存在一个数组里。怎么得到每一位呢?我们将该数循环%10然后/10,这样就能依次得到个位的数。
数组中的数是从个位开始的,但只是相加就不影响。最后判断一下即可。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long[] abcd = new long[4];
for(int i = 0;i < 4;i++) {
abcd[i] = scanner.nextLong();
}
long[] arr = new long[20];
int count = 0;
int j = 0;
for(int i = 0;i < 4;i++) {
for(int k = 0;k <20;k++) {
arr[k] = 0;
}
j=0;
while(abcd[i]>0) {
arr[j++] = abcd[i]%10;
abcd[i] = abcd[i]/10;
}
int sum = 0;
for(int k = 0;k < j;k++) {
sum+=arr[k];
}
if(sum==6||sum>=16) {
count++;
}
}
if(count==0) {
System.out.println("Bao Bao is so Zhai......");
}else if(count==1) {
System.out.println("Oh dear!!");
}else if(count==2) {
System.out.println("BaoBao is good!!");
}else if(count==3) {
System.out.println("Bao Bao is a SupEr man///!");
}else if(count==4) {
System.out.println("Oh my God!!!!!!!!!!!!!!!!!!!!!");
}
}
}
J.大扫除
题目:
你是一个住在大豪宅里的富二代「聘请的老青结清洁工」。
你需要给这座高 n 层楼的豪宅清理垃圾。
已知字符 "." 表示没有垃圾,其他任何字符都表示垃圾,每种字符表示一种垃圾。
要求计算整个豪宅每层楼垃圾种类的总和。
Input
第一行包含一个整数 T(1≤T≤10),表示有 T 组数据。
每组数据的第一行有一个数字 n(1≤n≤102), 表示豪宅的层数。
接下来 n 行每行有一个字符串 s(1≤|s|≤106) 这层楼的垃圾情况。
数据保证字符串中没有不可见字符,也没有空字符串。
数据保证总的字符数不超过 107。
Output
每组数据输出一个整数表示整座豪宅每层楼的垃圾总类的和。
思路:
使用一个boolean数组并结合ASCII码来表示一个垃圾是否出现,在该字符第一次出现的时候垃圾次数加1,后面发现如果已经出现了就不加1,在进入下一层的时候都要将数组重新初始化一下,因为如果同一个字符在不同的楼层出现是要统计多次的。
代码:
点击查看代码
import java.util.Scanner;
public class MainJ
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
int result = 0;
while(T-->0) {
int n = scanner.nextInt();
String[] str = new String[n];
int count = 0;
result = 0;
for(int i = 0;i < n;i++) {
str[i] = scanner.next();
}
for(int i = 0;i < n;i++) {
boolean[] flag = new boolean[300];
count=0;
for(int j = 0;j < str[i].length();j++) {
char op = str[i].charAt(j);
if(!flag[op]&&op!='.') {
count++;
}
flag[op] = true;
}
result += count;
}
System.out.println(result);
}
}
}