题 A

题A

牛牛带着 n 元钱去超市买东西,超市一共只有两款商品,
价格为 a 元的篮球和价格为 b 元的足球,
牛牛想把手里的钱尽可能花光,请问牛牛最少能剩多少钱?

输入描述:

输入一行,三个正整数 n,a,b(1 <= n,a,b <= 1000)n,a,b(1≤n,a,b≤1000),
n 表示牛牛现有的钱数,a 表示一个篮球的单价,b 表示一个足球的单价。

输出描述:

输出一行一个整数,代表牛牛最少能剩下的钱数。

  • 案例
    1
    2
    3
    4
    输入
    7 5 3
    输出
    1

考虑太多反而错了


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int money = in.nextInt();
int b = in.nextInt();
int f = in.nextInt();

int s1 = process1(money,b,f);
int s2 = process1(money,f,b);

if(s1 >= f){
s1 = process1(s1,f,b);
}

if(s2 >= b){
s2 = process1(s2,b,f);
}

System.out.println(s1 > s2 ? s2 : s1);
}

public static int process1(int money, int x,int y){
if(money % y == 0){
return 0;
}
if(money < x){
return money;
}
return process1(money - x, x,y);
}

}

语言:Java 代码长度:390 运行时间: 44 ms 占用内存:10572K


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;

public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int a=in.nextInt();
int b=in.nextInt();
// 初始化剩余最小值min
int min=n;
int p=n/a;
// 将所有的钱分成可以买a的所有次数
for(int i=0;i<=p;i++){
// 买i个a剩下的全买b看看剩下的钱是不是比min小
int temp=(n-a*i)/b;
int res=n-a*i-b*temp;
// 跟新最小值
min=min>res?res:min;
}
System.out.println(min);
}
}

题 B

题 B

牛牛给牛妹写了一封情书(仅包含小写字母aa到zz),但是被牛可乐截获了,由于牛可乐也喜欢牛妹,所以往这份情书里增加了许多数字和特殊字符(也可以不加),最后收到情书的牛妹想知道原本的情书是否包含某个字符串 kk。如果包含则输出 YES,否则输出 NO。

包含指 kk 是原本情书的子串,子串即任意连续的字符构成的子字符串,
例如对于字符串 abcdefgabcdefg,” abdabd “,” acgacg “,” afeafe” 不是该字符串的子串,” abcabc “,” cdecde “是该字符串的子串。

牛可乐添加的数字和特殊字符仅包含以下这些:

1
0123456789+-*|,.~!@#$%^&()[]{}'";:?<>/\

输入描述:

第一行输入两个正整数 n,m(1≤n,m≤5×10^3) ,
n 表示字符串 s 的长度,m 表示字符串 k 的长度。
第二行输入一个字符串 s ,代表牛妹最后收到的情书。
第三行输入一个字符串 k ,代表牛妹想知道原本的情书是否包含的单词。
保证 s 和 k 中都不包含空格。

输出描述:

输出一行一个YES或者NO代表答案。

  • 案例
    1
    2
    3
    4
    5
    6
    输入:
    25 4
    niu1niun\|olo5ve,ni+um/ei
    love
    输出:
    YES

语言:Java 代码长度:750 运行时间: 129 ms 占用内存:13852K


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();

String s = in.next();
String k = in.next();

String fu = "0123456789+-*|,.~!@#$%^&()[]{}'\";:?<>\\/";

char[] chars = s.toCharArray();
String newstr = "";
// 将原字符串中存在符号的变成空字符串
for(char temp : chars){
if(fu.contains(temp+"")){
continue;
}
newstr += temp;
}
if(newstr.contains(k)){
System.out.print("YES");
}else{
System.out.print("NO");
}

}
}

语言:Java 代码长度:519 运行时间: 69 ms 占用内存:11496K


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;

public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();

String s=in.next(),k=in.next();
StringBuilder sb=new StringBuilder();

for(int i=0;i<s.length();i++){
// 提取原字符串中的小写字符
if(s.charAt(i)>='a'&&s.charAt(i)<='z')
sb.append(s.charAt(i));
}
if(sb.toString().contains(k)){
System.out.println("YES");
}else{
System.out.println("NO");
}

}
}

题 C

题 C

有 n 个人排队,1 号排在 2 号前面,2 号排在 3 号前面,…,以此类推 n-1 号排在
n 号前面。在这个过程中,偶尔老师会把某个人叫走,叫走之后这个人就离开了队伍,
假设本来 a 排在 b 前面,b 排在 c 前面,b 被叫走后 a 就排在了 c 前面。
老师偶尔也会感到疑问,她想知道此时排在 a 号前面的同学是几号呢?
已知老师一共会有 k 次操作,每次会执行下面的一种:

  1. 把 x 叫走。
  2. 求排在 x 前面的是谁。

    第一行输入两个正整数 n,k(1≤n,k≤10^6) 。
    n 表示排队人数,k 表示老师的操作次数。
    接下来 k 行,每行包含 2 个整数,表示一个操作,具体如下:
    1 x :把 x 叫走,保证此时 x 一定在队伍里
    2 x :输出排在 x 前面的人的编号,保证此时 x 一定在队伍里,如果没有人排在 x 前面,输出 0 。(1≤x≤n)

    输入描述:

    5 4
    2 1
    1 3
    2 5
    2 4

    输出:

    0
    4
    2

  • 说明 只输出执行2的结果
  • 1 3 移除 3 需要判断3在队列中
  • 2 5 输出 5 前面的数值

语言:Java 代码长度:833 运行时间: 2962 ms 占用内存:117724K


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;

public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), k = sc.nextInt();
// 二维数组记录每个数值的前一个数和后一个数,第一个值为0
int[][] a = new int[n][2];
for(int i = 0; i < n; ++i){
a[i][0] = i - 1;
a[i][1] = i + 1;
}
StringBuilder sb = new StringBuilder();
while(k -- > 0){
int op = sc.nextInt(), x = sc.nextInt() - 1;
if(op == 1){
int prev = a[x][0], next = a[x][1];
// 判断前面是否有数,prev等于-1时为第一个数
if(prev >= 0){
//更新前一个数的next等于移除数的next
a[prev][1] = next;
}
// 判断后面是否有数,next等于5时为最后一个数
if(next < n){
// 更新后一个数的perv等于移除数的perv
a[next][0] = prev;
}
}else{
sb.append(a[x][0] + 1).append('\n');
}
}
System.out.println(sb);
}
}

题 D

题 D

牛牛和牛妹在玩游戏,他们的游戏规则是这样的:
一共有两堆石子,第一堆有 a 个,第二堆有 b 个,
牛牛和牛妹轮流取石子,牛牛先手,每次取石子的时候只能从以下 2
种方案种挑一种来取(对于选择的方案数必须保证当前石子 ≥ 取的石子个数才能取):

  1. 第一堆取 1 个,第二堆取 2 个
  2. 第一堆取 2 个,第二堆取 1 个
    谁先无法取石子,谁就输了。假设牛牛和牛妹都很聪明,请问谁会获胜?
    输入描述:

    第一行输入一个正整数 T(1≤T≤10^5) ,代表数据组数。
    接下来 T 行,每行输入两个整数 a,b(1≤a,b≤10^18) 代表两堆石子的数量。

    输出描述:

    对于每组数据,输出一行,代表胜利者的名字
    (牛牛获胜输出niuniu,牛妹获胜输出niumei)。

    实例:
    1
    2
    3
    4
    5
    6
    7
    输入:
    2
    1 2
    3 3
    输出:
    niuniu
    niumei

仔细思考题目可以发现,牛妹可以让石子数量始终减3
当石子数量是3的倍数时,牛牛先手的话,始终是牛妹赢
特殊情况,当两堆石子相同时,牛牛可以先拿一堆的第一个从而使牛妹成为先手


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int test = in.nextInt();

while (test-->0) {
long a = in.nextLong();
long b = in.nextLong();

if(a == b){
if((a-1)%3==0){
System.out.println("niumei");
continue;
}
}
long x = Math.min(a,b);
if(x%3==0)
System.out.println("niumei");
else
System.out.println("niuniu");
}
}
}

众所周知IO是最影响性能的因素,不使用java提供的输出和输入
自己写输入输出的IO流


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.*;

public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

int T = Integer.parseInt(reader.readLine());
while (T-->0){
String[] s = reader.readLine().split(" ");
long a = Long.parseLong(s[0]);
long b = Long.parseLong(s[1]);
if(a==b){
if((a-1)%3==0){
writer.write("niumei\n");
continue;
}
}
long x = Math.min(a,b);
if(x%3==0)writer.write("niumei\n");
else writer.write("niuniu\n");
}
writer.flush();
writer.close();
reader.close();
}
}