为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第一题-选修课
在线评测链接:P1266
题目内容
某大学一共有 n 门课程,编号为 1 ~ n , m 个学院,编号为1 ~ m 。最近开学季,很多学院都开放了选课窗口,但是很多课程在选课窗口也不一定能选择上,因为课程没有给某些学生开放选择权限,但是学生可以去找教务处帮忙选择该课程。
也就是说,如果塔子哥是计算机学院的一名学生,如果他可以选择计算机学院的一个课程,但是该课程没有开放权限让他选,他可以去找计算机学院的教务处帮忙选课,如果开放了权限,他就可以自己选课。但是如果塔子哥可以选择电气工程学院的一个课程,如果该课程没有开放权限,他就算是去找电气工程学院的教务处,这个教务处也无法帮塔子哥选课,因为塔子哥不是电气工程学院的学生,但如果该课程开放了权限,那么塔子哥就可以自己选课了。
因为这些过程自己一门门课程去想,很麻烦,所以学校想请你帮学生们制作一个能快速判断自己选课情况的程序,你能帮学校编写这个程序吗?
学校给出 n 门可选课程及其开课学院、允许在系统选课的年级和专业,进行 q 次查询,每次查询给出学生所属学院和待选课程,请你帮这些学生判断他们是否能选择该课程,如果能选,他应该怎样去选课。
若可以自行在选课,输出 Help yourself ,否则若可以由教务处成功代选,输出 Ask for help ,否则说明该学生无法选择该门课程,输出 Impossible 。
注意:
只有年级和学院都不被限制的学生可以自行选课。
输入描述
第一行输入为 3 个正整数;
第二行输入 n 个正整数,表示编号为 i 的课程的开课学院为
;
接下来 4 行输入一个 4×n 的 01矩阵 f , 表示没给 i 年级的学生开放选 j 课程的权限,
则表示开放了;
接下来 m 行输入一个的
01 矩阵 g , 表示没给 i 学院的学生开放自行选 j 课程的权限,
则表示开放了;
接下来 q 行,每行输入 3 个正整数 A,B,C ,表示学生所属学院、年级、待选课程。
输出描述
输出一共 q 行,每行一个字符串表示对应查询的结果。
样例
输入
5 5 10 5 10 5 3 6 0 1 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 1 4 3 1 2 2 4 2 3 5 4 3 4 1 3 3 5 4 1 5 2 4 1 4 4 5 1 3 5 3 1
输出
Impossible Help yourself Impossible Impossible Help yourself Ask for help Help yourself Help yourself Ask for help Ask for help
思路
模拟
按题意模拟即可。
-
自行选课:当前学生所在年级开放了选择当前课的权限,且当前学生所在学院开放了选择当前课的权限
-
教务处代选:不满足自行选课条件,且当前学生所在学院和课程所在学院是统一学院
-
无法选择:不满足上述两个条件
时间复杂度:O(nm)
类似题目推荐
LeetCode
周赛/双周赛 第一题
Codefun2000
-
美的 P1232. 2023.04.19-笔试-第一题-交换数值
-
P1174 华为od 2023.04.08--第一题-箱子之形摆放
-
P1166 美团 2023.04.08-第一题-换座位
代码
CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n, m, Q;
int s[N];
int f[5][N];
int g[N][N];
int main()
{
scanf("%d%d%d", &n, &m, &Q);
for (int i = 1; i <= n; ++i) scanf("%d", &s[i]);
for (int i = 1; i <= 4; ++i)
for (int j = 1; j <= n; ++j)
scanf("%d", &f[i][j]);
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= n; ++j)
scanf("%d", &g[i][j]);
while (Q--) {
int A, B, c;
scanf("%d%d%d", &A, &B, &c);
if (f[B][c] == 1 && g[A][c] == 1) {
puts("Help yourself");
} else if (s[c] == A) {
puts("Ask for help");
} else {
puts("Impossible");
}
}
return 0;
}
python
n, m, Q = map(int, input().split())
f = []
g = []
s = list(map(int, input().split()))
for i in range(len(s)):
s[i] -= 1
for i in range(1, 5):
f.append(list(map(int, input().split())))
for i in range(1, m + 1):
g.append(list(map(int, input().split())))
for _ in range(Q):
A, B, c = map(int, input().split())
A -= 1
B -= 1
c -= 1
if f[B][c] == 1 and g[A][c] == 1:
print("Help yourself")
elif s[c] == A:
print("Ask for help")
else:
print("Impossible")
Java
import java.util.Scanner;
public class Main {
static final int N = 20;
static int n, m, Q;
static int[] s = new int[N];
static int[][] f = new int[5][N];
static int[][] g = new int[N][N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
Q = sc.nextInt();
for (int i = 1; i <= n; ++i) s[i] = sc.nextInt();
for (int i = 1; i <= 4; ++i)
for (int j = 1; j <= n; ++j)
f[i][j] = sc.nextInt();
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= n; ++j)
g[i][j] = sc.nextInt();
while (Q-- > 0) {
int A = sc.nextInt();
int B = sc.nextInt();
int c = sc.nextInt();
if (f[B][c] == 1 && g[A][c] == 1) {
System.out.println("Help yourself");
} else if (s[c] == A) {
System.out.println("Ask for help");
} else {
System.out.println("Impossible");
}
}
}
}
Go
package main
import "fmt"
const N = 20
func main() {
var n, m, Q int
fmt.Scan(&n, &m, &Q)
s := make([]int, n+1)
for i := 1; i <= n; i++ {
fmt.Scan(&s[i])
}
f := make([][]int, 5)
for i := 1; i <= 4; i++ {
f[i] = make([]int, n+1)
for j := 1; j <= n; j++ {
fmt.Scan(&f[i][j])
}
}
g := make([][]int, m+1)
for i := 1; i <= m; i++ {
g[i] = make([]int, n+1)
for j := 1; j <= n; j++ {
fmt.Scan(&g[i][j])
}
}
for ; Q > 0; Q-- {
var A, B, c int
fmt.Scan(&A, &B, &c)
if f[B][c] == 1 && g[A][c] == 1 {
fmt.Println("Help yourself")
} else if s[c] == A {
fmt.Println("Ask for help")
} else {
fmt.Println("Impossible")
}
}
}
Js
process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
input += data;
return;
});
process.stdin.on('end', () => {
const lines = input.trim().split('\n');
const [n, m, Q] = lines.shift().trim().split(' ').map(Number);
const s = new Array(n + 1);
const row = lines.shift().trim().split(' ').map(Number);
for (let i = 0; i < n; ++i) s[i + 1] = row[i];
const f = new Array(5).fill(null).map(() => new Array(n + 1));
for (let i = 1; i <= 4; ++i) {
const row = lines.shift().trim().split(' ').map(Number);
for (let j = 1; j <= n; ++j) {
f[i][j] = row[j - 1];
}
}
const g = new Array(m + 1).fill(null).map(() => new Array(n + 1));
for (let i = 1; i <= m; ++i) {
const row = lines.shift().trim().split(' ').map(Number);
for (let j = 1; j <= n; ++j) {
g[i][j] = row[j - 1];
}
}
for (let i = 0; i < Q; ++i) {
const [A, B, c] = lines.shift().trim().split(' ').map(Number);
if (f[B][c] === 1 && g[A][c] === 1) {
console.log("Help yourself");
} else if (s[c] === A) {
console.log("Ask for help");
} else {
console.log("Impossible");
}
}
});


















