A 小石的签到题
链接:https://ac.nowcoder.com/acm/contest/949/A
来源:牛客网
题目描述
小石和小阳玩游戏,一共有 nn 个数,分别为 1∼n1∼n 。两人轮流取数,小石先手。对于每轮取数,都必须选择剩下数中的任意一个数 xx,同时还要取走 x,⌊x2⌋,⌊⌊x2⌋2⌋…x,⌊x2⌋,⌊⌊x2⌋2⌋… 如果某个数不存在,就停止取数(不能一个数都不取)。谁取走最后一个数,谁就输了。小石想知道自己能否获胜。 如果小石能赢,输出 “Shi”,否则输出 "Yang”(均不输出引号)。
思路:简单列举一下即可发现当且仅当 n==1 时,先手小石必输,其他情况下都必赢!
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
long n = in.nextLong();
if(n == 1){
System.out.println("Yang");
}else{
System.out.println("Shi");
}
}
}
B 小雨的三角形
链接:https://ac.nowcoder.com/acm/contest/949/B
来源:牛客网
题目描述
小雨手上有一个填满了数字的三角形。这个三角形一共有 nn 层,其中第 ii 层共有 ii个数,且第 11 个数和第 ii 个数均为 ii 。其余的数中,第 jj 个数是上一层中第 j−1j−1 个数和第 jj 个数的和。小雨想知道这个三角形第 xx 层到第 yy 层所有数的和,一共有 mm 个询问。
思路:试着写出来,可以发现每一层之和的规律 a[i] = 2*a[i-1]+2
import java.util.Scanner;
public class MainB {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] a = new int[n];//每一层的所有数之和
a[0] = 1;//第一层为1
for(int i = 1; i < n; i++) {
a[i] = (2*a[i-1]+2) % 1000000007;
}
for(int i = 0; i < m; i++) {
int x = in.nextInt();
int y = in.nextInt();
long sum = 0;
for(int j = x - 1; j <= y - 1; j++) {
sum += a[j];
sum = sum % 1000000007;
}
System.out.println(sum);
}
}
}
C 小石的海岛之旅
链接:https://ac.nowcoder.com/acm/contest/949/C
来源:牛客网
题目描述
暑假到了,小石和小雨到海岛上玩。
从水平方向看海岛可以看成 n个小块,每一个小块都有一个高度hi,
水位一开始为 0,随着水位的上升,海岛分成了若干块。
现在有 m 个询问,求当水位为ai时,海岛会分成多少块。
思路:暴力解决
时间复杂度:O(n*m)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int lands = in.nextInt();
int count = in.nextInt();
int[] land = new int[lands];
for(int i = 0; i < lands; i++) {
land[i] = in.nextInt();
}
int pre = 0;//前一次水位
// count次询问
for(int i = 0; i < count; i++) {
//每一次询问,now表示该次的水位
int now = in.nextInt();
int dif = now - pre;//由于数组在上一次已经减去了上一次的水位,所以每次我们应该算水位差
for(int j = 0; j < lands; j++) {
land[j] -= dif;
}
int res = 0;//记录块数
boolean temp = false;//记录前一个是否露出水面,如果露出则为true,不露出为false
for(int j = 0; j < lands; j++) {
if (!temp && land[j] > 0) {
//如果前一个小岛不露出水面,这个小岛露出
res++;
temp = true;
//如果下一个小岛露出水面,由于temp为true,所以res不用加1
}
if (temp && land[j] <= 0) {
temp = false;
}
}
pre = now;
System.out.println(res);
}
}
}
D 小阳买水果
E 小雨的矩阵
链接:https://ac.nowcoder.com/acm/contest/949/E
来源:牛客网
题目描述
小雨有一个 n×nn×n 的矩阵,起点在(1,1),终点在(n,n),只能向下或向右走,且每次只能走 1 步。矩阵上每个点都有一个点权 ai,jai,j 。
求走到终点的路径有多少不同的点权和。
思路:DFS,递归写法
import java.util.HashSet;
import java.util.Scanner;
public class MainE {
static int N;
static int[][] matrix;
//存储不同的点权和
static HashSet<Integer> set = new HashSet<>();
public static void dfs(int x, int y, int sum) {
if (x == N - 1 && y == N - 1) {
set.add(sum);
return;
}
if (x >= N || y >= N) {
return;
}
//向下走
dfs(x + 1, y, sum + matrix[x][y]);
//向右走
dfs(x, y + 1, sum + matrix[x][y]);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
N = in.nextInt();
matrix = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
matrix[i][j] = in.nextInt();
}
}
dfs(0, 0, 0);
System.out.println(set.size());
}
}
F 小石的妹子
链接:https://ac.nowcoder.com/acm/contest/949/F
来源:牛客网
题目描述
小石有 n 个妹子,每个妹子都有一个细心程度 ai 和一个热心程度 bi,小石想给她们一个重要程度 titi(重要程度为 1 表示最重要,重要程度越小表示越重要)。如果一个妹子 i 的细心程度和热心程度都比妹子 j 大,那么妹子 i 的重要程度要大于妹子 j 的重要程度,即妹子 i 比妹子 j 重要。
流程如下:
每次从所有没有重要程度的妹子中,找到若干妹子。对于这些妹子的任意一个,需要保证没有其他妹子比她更重要。然后把她们的重要程度标为 1 。下一次再从剩下没有重要程度的妹子中找到若干妹子,依然符合上述条件,然后把她们的重要程度标为 2,……,重复直到所有妹子都有自己的重要程度。
由于妹子太多,小石忙不过来,请你帮帮他。
备注:
1≤n≤10^5,1≤ai,bi≤10^9
G 小石的图形
链接:https://ac.nowcoder.com/acm/contest/949/G
来源:牛客网
题目描述
小石想在一面墙旁边建造一段长度为 n 的篱笆来围出一块地(如图)。
求最大的地的面积。
输出最大面积,保留 3 位小数
思路:小学数学,当且仅当绳子围成半圆时面积最大
注意:java中怎么保留小数后三位
import java.util.Scanner;
public class MainG {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt();
double res = 0.5 * n * n / Math.PI;
int result = (int) Math.round(res * 1000);
String r = String.format("%.3f", result / 1000.0);
System.out.println(r);
}
}
}
H 小阳的贝壳
链接:https://ac.nowcoder.com/acm/contest/949/H
来源:牛客网
题目描述
小阳手中一共有 n 个贝壳,每个贝壳都有颜色,且初始第 i 个贝壳的颜色为 colicoli 。现在小阳有 3 种操作:
1 l r x:给 [l,r][l,r] 区间里所有贝壳的颜色值加上 xx 。
2 l r:询问 [l,r][l,r] 区间里所有相邻贝壳 颜色值的差(取绝对值) 的最大值(若 l=rl=r 输出 0)。
3 l r :询问 [l,r][l,r] 区间里所有贝壳颜色值的最大公约数。
备注:
1≤n,m≤105,1≤coli,x≤103,1≤opt≤3,1≤l≤r≤n
I 石头剪刀布
链接:https://ac.nowcoder.com/acm/contest/949/I
来源:牛客网
题目描述
小阳和小石玩石头剪刀布的游戏,他们在地上画了 n 个长度为 1 的格子。小阳一开始在 1 号格子,如果小阳赢了,那么他就能往前走 1 格(若在 n 号格子,则不往前走)。如果输了,就倒退 1 格(若在 1 号格子,则不往后走),平局原地不动。小阳已经知道了他石头剪刀布赢的概率是 aa,平的概率是 bb,显然输的概率是 1−a−b1−a−b。求小阳走到 n 号格子期望进行多少局石头剪刀布。
答案对 10^9+7取模。
输入描述:
第一行输入三个正整数 n,a,b,表示格子个数,小阳石头剪刀布赢的概率和平的概率。(概率已对 10^9+7 取模)
输出描述:
共一行,输出答案。
示例1
输入50 200000002 400000003
输出630223353
备注:
1≤n≤100,1<a,b<10^9+7
J 小雨坐地铁
链接:https://ac.nowcoder.com/acm/contest/949/J
来源:牛客网
题目描述
小雨所在的城市一共有 mm 条地铁线,分别标号为 1 号线,2 号线,……,m 号线。整个城市一共有 nn 个车站,编号为 1∼n1∼n 。其中坐 i 号线需要花费 aiai 的价格,每坐一站就需要多花费 bibi 的价格。i 号线有 cici 个车站,而且这 cici 个车站都已知,如果某一站有多条地铁线经过,则可以在这一站换乘到另一条地铁线,并且能多次换乘。现在小雨想从第 ss 个车站坐地铁到第 tt 个车站,地铁等待时间忽略不计,求最少花费的价格,若不能到达输出 -1 。(地铁是双向的,所以 ss 可能大于 tt)
输入描述:
第一行输入四个正整数 n,m,s,tn,m,s,t,分别表示车站个数,地铁线数,起点站和终点站。 第二行到第 m+1m+1 行,每行前三个数为 ai,bi,ciai,bi,ci,分别表示坐 i 号线的价格,i 号线每坐一站多花的价格,i 号线车站个数。接下来 cici 个数,表示 i 号线的每一个车站的编号,单调递增。 输出描述:
共一行,一个数表示最小花费,若不能到达输出 -1 。
示例1
输入
5 2 1 4 2 2 3 1 3 5 2 1 4 2 3 4 5
输出
7
说明
坐 1 号线:花费 2; 1→31→3:花费 2; 换乘 2 号线:花费 2; 3→43→4:花费 1; 所以最小总花费为 7 。
备注:
1≤n≤103,1≤m≤500,1≤s,t≤n1≤n≤103,1≤m≤500,1≤s,t≤n 1≤ai,bi≤100,1≤ci≤n,m∑i=1ci≤105