1.组队
-
题目:
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1号位至 5 号位的评分之和最大可能是多少?
-
解答:
- 思路:切记每个人只能参加在一个位置,不可重复,若重复将计算错误得到答案492。
- 最终答案:490,解题步骤如下所示。
号位 | 1号位 | 2号位 | 3号位 | 4号位 | 5号位 |
---|---|---|---|---|---|
编号 | 1 | 10 | 17 | 11 | 15 |
成绩 | 97 | 99 | 99 | 97 | 98 |
- 代码(暴力解法)
public class A {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int[][] arr = new int[20][6];
for (int i = 0; i < 20; i++)
for (int j = 0; j < 6; j++)
arr[i][j] = cin.nextInt();
int max = 0;
for (int i = 0; i < 20; i++)
for (int j = 0; j < 20; j++)
for (int m = 0; m < 20; m++)
for (int n = 0; n < 20; n++)
for (int k = 0; k < 20; k++){
int sum = 0;
if(i!=j && i!=m&&i!=n&&i!=k &&j!=m&&j!=n&&j!=k&&m!=n&&m!=k&&n!=k)
sum = arr[i][1]+arr[j][2]+arr[m][3]+arr[n][4]+arr[k][5];
if(sum > max)
max = sum;
}
System.out.println(max);
}
}
2.不同的子串
- 题目:
一个字符串的非空子串是指字符串中长度至少为1的连续的一段字符组成的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共7 个。
注意在计算时,只算本质不同的串的个数。请问,字符串0100110001010001 有多少个不同的非空子串? - 解答:
- 思路:求串的所有子集,并且所有相同的子串为一种。因为hashset会自动排除重复元素,所以将所有可能的子串都加入到hashset集合中。最后返回set集合的元素个数。
- 最终答案:200
- 代码:
public class B {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String s = cin.next();
Set<String> set = new HashSet<String>();
for (int i=0;i<s.length();i++){
for(int j=i;j<s.length();j++){
String ss = s.substring(i,j+1);
set.add(ss);
}
}
System.out.println(set);
System.out.println(set.size());
}
}
3.数列求值
- 题目:
给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3项的和。求第20190324项的最后4位数字。 - 解答:
- 思路:求最后4位数字,即对10000取余。
- 最终答案:4659
- 代码:
public class C {
public static void main(String[] args) {
int a = 1;
int b = 1;
int c = 1;
for (int i=4;i<=20190324;i++){
int temp = (a+b+c)%10000;
a = b;
b = c;
c = temp;
}
System.out.println(c);
}
}
4.数的分解
- 题目:
把2019 分解成3 个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
注意交换3 个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。 - 解答:
- 思路:
① 3个不同的正整数之和等于2019
② 每个正整数都不包含数字2和4
方法一:一种组合3个数字不同变换一种有6种,最后结果/6(缺点:运行时间太长)
方法二:i从0开始取,j从i+1开始取,k从j+1开始取,避免整数重复
- 最终答案:40785
- 代码:
public class 数的分解 {
public static Boolean judge(int k){
char[] a = String.valueOf(k).toCharArray();
for(int i=0;i<a.length;i++)
if(a[i]=='2'|| a[i]=='4')
return false;
return true;
}
//方法一
public static void main(String[] args) {
int sum = 0;
for(int i=1;i<2019;i++)
for(int j=1;j<2019;j++)
for(int k=1;k<2019;k++)
if(i+j+k==2019)
if(judge(i) && judge(j) && judge(k)){
if(i!=j && i!=k && j!=k)
sum++;
System.out.println(sum/6);
}
//方法二
public static void main(String[] args) {
int sum = 0;
for(int i=1;i<2019;i++)
for(int j=i+1;j<2019;j++)
for(int k=j+1;k<2019;k++)
if(i+j+k==2019)
if(judge(i) && judge(j) && judge(k)){
if(i!=j && i!=k && j!=k)
sum++;
System.out.println(sum);
}
}
6.特别数的和
- 题目:
【问题描述】
小明对数位中含有2、0、1、9 的数字很感兴趣(不包括前导0),在1 到40 中这样的数包括1、2、9、10 至32、39 和40,共28 个,他们的和是574。请问,在1 到n 中,所有这样的数的和是多少?
输入:输入一行包含一个整数n。
输出:输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】40
【样例输出】574 - 解答思路:
将数字转成字符串,判断每个字符串中是否包含2、0、1、9中其中一个数字,如果有则进行累加。 - 代码:
import java.util.Scanner;
public class 特别数的和 01{
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int sum = 0;
for(int i=1;i<=n;i++){
int j=0;
char[] a = String.valueOf(i).toCharArray();
for(;j<a.length;j++)
if(a[j]=='0'||a[j]=='2'||a[j]=='1'||a[j]=='9')
break;
if(j<a.length)
sum += i;
}
System.out.println(sum);
}
}
import java.util.Scanner;
public class 特别数的和 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
long sum = 0;
for (int i = 1; i <= n; i++){
if(judge(i))
sum += i;
}
System.out.println(sum);
}
public static boolean judge(int n){
while(n != 0){
int k = n % 10;
if(k==2 || k==1 || k==0 || k==9)
return true;
n /= 10;
}
return false;
}
}
7.外卖店铺优先级
- 题目:
【问题描述】
“饱了么”外卖系统中维护着N家外卖店,编号1N。每家外卖店都有一个优先级,初始时(0 时刻) 优先级都为0。每经过1 个时间单位,如果外卖店没有订单,则优先级会减少1,最低减到0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加2。如果某家外卖店某时刻优先级大于5,则会被系统加入优先缓存中;如果优先级小于等于3,则会被清除出优先缓存。
给定T 时刻以内的M 条订单信息,请你计算T 时刻时有多少外卖店在优先缓存中。
【输入格式】
第一行包含3 个整数N、M 和T。
以下M 行每行包含两个整数ts 和id,表示ts 时刻编号id 的外卖店收到一个订单。
【输出格式】
输出一个整数代表答案。
【样例输入】
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
【样例输出】
1
【样例解释】
6 时刻时,1 号店优先级降到3,被移除出优先缓存;2 号店优先级升到6,加入优先缓存。所以是有1 家店(2 号) 在优先缓存中。 - 代码:
package day2019;
import java.awt.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class G {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt(); //n各店家
int m = cin.nextInt(); //m条信息
int t = cin.nextInt(); // t时刻
int[] level = new int[n+1]; //存放优先级
Set<Integer> set = new HashSet<Integer>(); //存放在队列的商家
ArrayList[] array=new ArrayList[t+1];
for(int i = 0; i <= t;i++)
array[i] = new ArrayList();
for(int i = 1; i <= m;i++){
int ts = cin.nextInt();
int id = cin.nextInt();
array[ts].add(id);
}
for(int i = 1;i <= t; i++){
for(int j = 1;j <= n;j++){
Object k = j;
int flag = 0;
while(array[i].contains(k)){
flag = 1;
level[j] += 2;
array[i].remove(k);
if(level[j] > 5){
set.add(j);
}
}
if(flag == 0){
level[j] = level[j]==0 ? 0 : level[j]-1;
if(set.contains(j)){
if(level[j] <= 3)
set.remove(j);
}
}
}
}
System.out.println(set.size());
}
}
8.人物相关性分析
- 题目:
【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。 更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
This is a story about Alice and Bob.Alice wants to send aprivate message to Bob. 假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob” 和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。 注意: 1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。 2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如 Bobbi 並不算出现了 Bob。
【输入格式】
第一行包含一个整数 K。 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超 过 1000000。
【输出格式】
输出一个整数,表示 Alice 和 Bob 同时出现的次数。
【样例输入】
20 This is a story about Alice and Bob.Alice wants to send aprivate message to Bob.
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1≤ K ≤1000000。 - 代码①:
import java.util.Scanner;
public class 人物相关性分析 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int k = cin.nextInt();
// nextLine吸取回车键
cin.nextLine();
String s = cin.nextLine();
// 以空格和.分割出来,注意.空格的组合存放为空字符串
String[] arr = s.split("\\s+|\\.");
int sum = 0;
// Alice------>Bob
for(int i = 0; i < arr.length; i++){
if(arr[i].equals("Alice")){
int dis = 0;//记录间隔字符数量
for(int j = i+1; j < arr.length; j++){
if(arr[j].equals("Bob") && dis <= k)
sum ++;
else
dis = dis+j-i+1+arr[j].length();
}
}
}
// Bob--------->Alice
for(int i = 0; i < arr.length; i++){
if(arr[i].equals("Bob")){
int dis = 0;
for(int j = i+1; j < arr.length; j++){
if(arr[j].equals("Alice") && dis <= k)
sum ++;
else
dis = dis+j-i+1+arr[j].length();
}
}
}
System.out.println(sum);
}
}
- 代码②
public class H{
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int res = 0; //save result
int K = reader.nextInt();
reader.nextLine(); //nextLine吸取回车键
String str = reader.nextLine();
String words[] = str.split("\\s+|\\."); //以空格和.分割出来,注意.空格的组合存放为空字符串
// Alice------>Bob
for(int i=0;i<words.length;i++){
if(words[i].equals("Alice")){
for(int j=i+1;j<words.length;j++){
if(words[j].equals("Bob")){
int sum=1; //这里要等于1
for(int k=i+1;k<j;k++)
sum+=words[k].length()+1;
if(sum<=K)
res++;
}
}
}
}
//Bob--------->Alice
for(int i=0;i<words.length;i++){
if(words[i].equals("Bob")){
for(int j=i+1;j<words.length;j++){
if(words[j].equals("Alice")){
int sum=1; //这里要等于1
for(int k=i+1;k<j;k++)
sum+=words[k].length()+1;
if(sum<=K)
res++;
}
}
}
}
System.out.println(res);
}
}
9.后缀表达式
-
题目:
【问题描述】
给定N 个加号、M 个减号以及N + M + 1 个整数A1; A2; ; AN+M+1,小明想知道在所有由这N 个加号、M 个减号以及N + M +1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?请你输出这个最大的结果。
例如使用1 2 3 + -,则“2 3 + 1 -” 这个后缀表达式结果是4,是最大的。
【输入格式】
第一行包含两个整数N 和M。
第二行包含N + M + 1 个整数A1; A2; ; AN+M+1。
【输出格式】
输出一个整数,代表答案。
【样例输入】
1 1
1 2 3
【样例输出】
4 -
代码:
import java.util.*;
public class 后缀表达式 {
public static void main(String[] args) {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
int[] a = new int[n+m+1];
for(int i = 0; i < a.length; i++){
a[i] = cin.nextInt();
}
Arrays.sort(a);
int sum = 0;
for(int i=0;i<m;i++)
sum -= a[i];
for(int i=m;i<n+m+1;i++)
sum += a[i];
System.out.println(sum);
}
}