2020年csp认证题解
2020年csp题解
202012
T1期末预测之安全指数
import java.util.Scanner;
public class Maincsp8 {//202012-1 期末预测之安全指数
static int n;
static int ans;
public static void main(String[] args){
Scanner in = new Scanner(System.in);
n = in.nextInt();
for(int i = 1;i <= n;i ++){
int a = in.nextInt();
int b = in.nextInt();
ans += a * b;
}
ans = Math.max(ans,0);
System.out.println(ans);
}
}
T2期末预测之最佳阈值
import java.util.*;
public class Maincsp9 {//202012-2 期末预测之最佳阈值
static int m;
static class node {
int y,res;
}
static class cmp implements Comparator<node>{
public int compare(node a,node b){
if(a.y != b.y)return a.y - b.y;
else return 0;
}
}
static int [] vis = new int[100000010];
static node [] a = new node[200010];
static int [] sum1 = new int[200010];
static int [] sum2 = new int[200101];
public static void main(String[] args){
Scanner in = new Scanner(System.in);
m = in.nextInt();
for(int i = 1;i <= m;i ++){
a[i] = new node();
a[i].y = in.nextInt();
a[i].res = in.nextInt();
}
Arrays.sort(a,1,m + 1,new cmp());
for(int i = 1;i <= m;i ++){
sum1[i] = sum1[i - 1] + a[i].res;
if(a[i].res == 0)sum2[i] = sum2[i - 1] + 1;
else sum2[i] = sum2[i - 1];
//System.out.print(a[i].res +" ");
}
int cnt = 0,ans = 0;
for(int i = 1;i <= m;i ++){
if(vis[a[i].y] == 1)continue;
vis[a[i].y] = 1;
//System.out.println(a[i].y + " " + sum2[i - 1] + " " + (sum1[m] - sum1[i - 1]));
int tmp = sum2[i - 1] + sum1[m] - sum1[i - 1];
if(tmp >= cnt){
ans = a[i].y;
cnt = tmp;
}
}
System.out.println(ans);
}
}
T3带配额的文件系统 50pts
剩下50真不是给人写的
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class Maincsp16 {
static String [] p = new String[200];
static int tot,cnt,ans;
static class file {
HashMap<String,Integer> f = new HashMap<>();
int flag = 0;
public file(){}
}
static file [] t = new file[2010000];
static void init(String path) {
path += "/";
int n = path.length();int last = 0;tot = 0;
for(int i = 1;i < n;i ++) {
if(path.charAt(i) == '/') {
p[++ tot] = path.substring(last + 1,i);
last = i;
}
}
}
static void dfsc(int x,int dep) {
if(dep > tot)return ;
if(t[x].f.containsKey(p[dep])) {
int v = t[x].f.get(p[dep]);
if(dep <= tot && t[x].flag == 1) {
ans = 1;return ;
}
if(dep == tot && t[v].flag == 0) {
ans = 1;return ;
}
dfsc(v,dep + 1);
}
else {
//System.out.print(t[x].flag + " " + p[dep] + " " + x + "\n");
if(t[x].flag == 0) {
t[x].f.put(p[dep], ++cnt);
t[cnt] = new file();
if (dep == tot) t[cnt].flag = 1;
dfsc(cnt, dep + 1);
}
else {
ans = 1;
}
}
}
static void dfsr(int x,int dep) {
if(dep > tot)return ;
if(dep == tot) {
t[x].f.remove(p[dep]);
}
else {
if(t[x].f.containsKey(p[dep]))dfsr(t[x].f.get(p[dep]), dep + 1);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
t[0] = new file();
for(int i = 1;i <= n;i ++) {
String opt = in.next();ans = 0;
if(opt.equals("C")) {
String path = in.next();
int size = in.nextInt();
init(path);
dfsc(0,1);
}
else if(opt.equals("R")) {
String path = in.next();
init(path);
dfsr(0,1);
}
if(ans == 0)System.out.println("Y");
else System.out.println("N");
}
}
}
/*
6
C /A/B/1 1024
C /A/B/1 1024
C /A/B/3 1024
C /A/B/D/3 1024
C /A/C/4 1024
C /A/C/D/4 1024
*/
T4食材运输
import java.util.Arrays;
import java.util.Scanner;
public class Maincsp10 {//202012-4 食材运输
static int n,m,k,sum,mx,ans;
static int l;
static final int maxn = 210;
static int [] pre = new int[maxn];
static int [] last = new int[maxn];
static int [] other = new int[maxn];
static int [] len = new int[maxn];
static int [][] t = new int[maxn][maxn];
static int [] dis = new int[maxn];
static int [] flag = new int[maxn];
static int [][] a = new int[maxn][maxn];
static int [][][] dp = new int[110][1 << (11)][20];
static int [] now = new int[maxn];
static void add(int x,int y,int z){
l ++;
pre[l] = last[x];
last[x] = l;
other[l] = y;
len[l] = z;
}
static void dfs(int x,int fa,int y){
if(t[x][y] == 1){
flag[x] = 1;
mx = Math.max(mx,dis[x]);
}
for(int p = last[x];p != 0;p = pre[p]){
int v = other[p];
if(v == fa)continue;
dis[v] = dis[x] + len[p];
dfs(v,x,y);
if(flag[v] == 1)sum += len[p] * 2;
if(flag[v] == 1)flag[x] = 1;
}
}
static boolean check(int x){
// System.out.println(x);
for(int i = 0;i <= n;i ++) {
now[i] = 0;
for (int j = 0; j < (1 << k); j++)
for (int p = 0; p <= m; p++)
dp[i][j][p] = 0;
}
for(int i = 1;i <= k;i ++) {
for(int j = 1;j <= n;j ++){
if(a[i][j] <= x) {
now[j] += (1 << (i - 1));
}
}
}
dp[0][0][0] = 1;
for(int i = 0;i < n;i ++) {
for(int j = 0;j < (1 << k);j ++){
for(int p = 0;p <= m;p ++){
dp[i + 1][j | now[i + 1]][p + 1] |= dp[i][j][p];
dp[i + 1][j][p] |= dp[i][j][p];
}
}
}
if(dp[n][(1 << k) - 1][m] == 1) return true;
else return false;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
n = in.nextInt();m = in.nextInt();k = in.nextInt();
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= k;j ++){
t[i][j] = in.nextInt();
}
}
for(int i = 1;i < n;i ++){
int x = in.nextInt();
int y = in.nextInt();
int z = in.nextInt();
add(x,y,z);add(y,x,z);
}
for(int i = 1;i <= k;i ++){
for(int j = 1;j <= n;j ++){
sum = 0;mx = 0;
int tmp = 1000000007;
dfs(j,0,i);
tmp = Math.min(tmp,sum - mx);
// System.out.print(tmp + " ");
for(int p = 1;p <= n;p ++){
dis[p] = 0;flag[p] = 0;
}
a[i][j] = tmp;
}//System.out.println(" ");
//ans = Math.max(ans,tmp);
}
int l = 0,r = 200000000;
while(l <= r) {
int mid = l + r >> 1;
if(check(mid)){
r = mid - 1;ans = mid;
}
else l = mid + 1;
}
System.out.print(ans);
}
}
202009
T1称检测点查询
import java.util.*;
import java.io.*;
public class Maincsp12 {//202009-1 称检测点查询
static class in {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in = new StreamTokenizer(br);
static String next() throws IOException {
return br.readLine();
}
static long nextLong() throws IOException {
return (long) in.nval;
}
static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
static double nextDouble() throws IOException {
in.nextToken();
return in.nval;
}
}
static int n,X,Y,ans1,ans2,ans3;
static int mn1,mn2,mn3;
public static void main(String[] args) throws IOException{
n = in.nextInt();X = in.nextInt();Y = in.nextInt();
mn1 = mn2 = mn3 = 100000010;
for(int i = 1;i <= n;i ++) {
int x = in.nextInt(),y = in.nextInt();
int tmp = (X - x) * (X - x) + (Y - y) * (Y - y);
if(tmp < mn1) {
mn3 = mn2;mn2 = mn1;
ans3 = ans2;ans2 = ans1;
mn1 = tmp;ans1 = i;
}
else if(tmp < mn2) {
mn3 = mn2;
ans3 = ans2;
mn2 = tmp;ans2 = i;
}
else if(tmp < mn3) {
mn3 = tmp;ans3 = i;
}
}
System.out.printf("%d\n%d\n%d\n",ans1,ans2,ans3);
}
}
T2风险人群筛查
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Maincsp13 {
static class in {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in = new StreamTokenizer(br);
static String next() throws IOException {
return br.readLine();
}
static long nextLong() throws IOException {
return (long) in.nval;
}
static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
static double nextDouble() throws IOException {
in.nextToken();
return in.nval;
}
}
static int n,k,t,x1,x2,y1,y2;
static int ans1,ans2;
public static void main(String[] agrs) throws IOException{
n = in.nextInt();k = in.nextInt();t = in.nextInt();
x1 = in.nextInt();y1 = in.nextInt();x2 = in.nextInt();y2 = in.nextInt();
for(int i = 1;i <= n;i ++) {
int cnt = 0,flag1 = 0,flag2 = 0;
for(int j = 1; j <= t;j ++) {
int x = in.nextInt(),y = in.nextInt();
if(x >= x1 && y >= y1 && x <= x2 && y <= y2){cnt ++;flag1 = 1;}
else cnt = 0;
if(cnt == k && flag2 == 0){ans2 ++;flag2 = 1;}
}
if(flag1 == 1)ans1 ++;
}
System.out.printf("%d\n%d",ans1,ans2);
}
}
T3点亮数字人生
import java.util.Scanner;
public class Maincsp18 {
static int n,m,l;
static int [][] ans = new int[10011][3010];
static int [] flag = new int[10101];
static int [] q = new int[10100];
static int [] pre = new int[10101];
static int [] last = new int[10101];
static int [] other = new int[10101];
static int [] d = new int[10101];
static int [] v = new int[10100];
static int [] d1 = new int[10101];
static void add(int x,int y) {
l ++;
pre[l] = last[x];
last[x] = l;
other[l] = y;
}
static int init(String s) {
int tmp = 0;
s = s.substring(1);
for(int i = 0;i < s.length();i ++) {
tmp = tmp * 10 + s.charAt(i) - '0';
}
return tmp;
}
static int not(int x) {
if(x == 1)return 0;return 1;
}
static void topsort(int now) {
int h = 0,t = m;
for(int i = 1;i <= 3000;i ++)q[i] = 0;
for(int i = 1;i <= m + n ;i ++) {
if(i <= m)q[i] = i;
d1[i] = d[i];
ans[now][i] = v[i];
}
while(h < t) {
int x = q[++ h];
for(int p = last[x];p != 0;p = pre[p]) {
int v1 = other[p];
if(flag[v1] == 1)ans[now][v1] = not(ans[now][x]);
if(flag[v1] == 2)ans[now][v1] &= ans[now][x];
if(flag[v1] == 3)ans[now][v1] |= ans[now][x];
if(flag[v1] == 4)ans[now][v1] ^= ans[now][x];
if(flag[v1] == 5)ans[now][v1] &= ans[now][x];
if(flag[v1] == 6)ans[now][v1] |= ans[now][x];
d1[v1] --;
if(d1[v1] == 0) {
q[++t] = v1;
if(flag[v1] == 5 || flag[v1] == 6)ans[now][v1] = not(ans[now][v1]);
}
}
}
}
static int check() {
int h = 0,t = m;
for(int i = 1;i <= 3000;i ++)q[i] = 0;
for(int i = 1;i <= m + n ;i ++) {
if(i <= m)q[i] = i;
d1[i] = d[i];
}
while(h < t) {
int x = q[++ h];
for(int p = last[x];p != 0;p = pre[p]) {
int v1 = other[p];
d1[v1] --;
if(d1[v1] == 0) q[++ t] = v1;
}
}
if(t != m + n)return 1;
return 0;
}
static void Pre(String s,int x) {
if(s.equals("NOT")){flag[x] = 1;}
else if(s.equals("AND")){flag[x] = 2;v[x] = 1;}
else if(s.equals("OR"))flag[x] = 3;
else if(s.equals("XOR"))flag[x] = 4;
else if(s.equals("NAND")){flag[x] = 5;v[x] = 1;}
else if(s.equals("NOR"))flag[x] = 6;
}
static void clear() {
l = 0;
for(int i = 0;i <= 3000;i ++)v[i] = 0;
for(int i = 0;i <= 3000;i ++)last[i] = 0;
for(int i = 0;i <= 3000;i ++){d[i] = 0;flag[i] = 0;}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
while(T -- != 0) {
m = in.nextInt();n = in.nextInt();
clear();
for(int i = 1;i <= n;i ++) {
String opt = in.next();
int k = in.nextInt();
Pre(opt,i + m);d[m + i] = k;
for(int j = 1;j <= k;j ++) {
String tmp = in.next();
int x = init(tmp);
if(tmp.charAt(0) == 'I') add(x,m + i);
else add(m + x,m + i);
}
}
int f = check();
int s = in.nextInt();
if(f == 0) {
for (int i = 1; i <= s; i++) {
for (int j = 1; j <= m; j++) {
v[j] = in.nextInt();
}
topsort(i);
}
for(int i = 1;i <= s;i ++) {
int k = in.nextInt();
for(int j = 1;j <= k;j ++) {
int t = in.nextInt();
System.out.print(ans[i][t + m] + " ");
}System.out.println();
}
}
else {
for(int i = 0;i <= 2 * s;i ++) {
in.nextLine();
}
System.out.println("LOOP");
}
}
}
}
202006
T1线性分类器
import java.util.Scanner;
public class Maincsp14 {
static int n,m;
static int cnt2,cnt1;
static int [] a = new int[100010];
static int [] b = new int[100010];
static int [] l = new int[101010];
static int [] r = new int[101001];
static boolean check(int x,int y,int z) {
int flag1 = 0,flag2 = 0;
for(int i = 1;i <= cnt1;i ++) {
if(x + y * a[l[i]] + z * b[l[i]] > 0)flag1 ++;
else if(x + y * a[l[i]] + z * b[l[i]] < 0)flag2 ++;
if(flag1 > 0 && flag2 > 0)return false;
}
flag1 = flag2 = 0;
for(int i = 1;i <= cnt2;i ++) {
if(x + y * a[r[i]] + z * b[r[i]] > 0)flag1 ++;
else if(x + y * a[r[i]] + z * b[r[i]] < 0)flag2 ++;
if(flag1 > 0 && flag2 > 0)return false;
}
return true;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
for (int i = 1; i <= n; i++) {
a[i] = in.nextInt();
b[i] = in.nextInt();
String s = in.next();
if (s.equals("A")) l[++cnt1] = i;
else r[++cnt2] = i;
}
for (int i = 1; i <= m; i++) {
int x = in.nextInt(), y = in.nextInt(), z = in.nextInt();
if(check(x,y,z)) {
System.out.println("Yes");
}
else System.out.println("No");
}
}
}
T2稀疏向量
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Maincsp15 {
static int a,b;
static class node {
int id;long val;
}
static node [] u = new node[501010];
static node [] v = new node[505010];
static class cmp implements Comparator<node> {
public int compare (node a,node b) {
return a.id - b.id;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
a = in.nextInt();b = in.nextInt();
for(int i = 1;i <= a;i ++) {
u[i] = new node();
u[i].id = in.nextInt();u[i].val = in.nextLong();
}
for(int i = 1;i <= b;i ++) {
v[i] = new node();
v[i].id = in.nextInt();v[i].val = in.nextLong();
}
Arrays.sort(u,1,1 + a,new cmp());
Arrays.sort(v,1,1 + b,new cmp());
int cnt1 = 1,cnt2 = 1;long ans = 0;
while(cnt1 <= a && cnt2 <= b) {
if(u[cnt1].id == v[cnt2].id) {
ans += u[cnt1].val * v[cnt2].val;
cnt1 ++;cnt2 ++;
}
else if(u[cnt1].id < v[cnt2].id)cnt1 ++;
else cnt2 ++;
}
System.out.println(ans);
}
}
T4 1246
\(len == 2\)不想写了
import java.util.Scanner;
public class Maincsp17 {
static int n;
static String s;
final static long mo = 998244353;
static class mat {
long [][] m = new long[10][10];
public mat() {
this.m = m;
}
}
static mat e;
static mat mul(mat a,mat b) {
mat c = new mat();
for(int i = 1;i <= 4;i ++) for(int j = 1;j <= 4;j ++)c.m[i][j] = 0;
for(int i = 1;i <= 4;i ++)
for(int j = 1;j <= 4;j ++)
for(int k = 1;k <= 4;k ++)
c.m[i][j] = (c.m[i][j] + a.m[i][k] * b.m[k][j] % mo) % mo;
return c;
}
static mat qp (mat a,int b) {
mat ans = a;mat base = e;
while(b > 0) {
if((b & 1) != 0)ans = mul(ans,base);
base = mul(base,base);
b >>= 1;
}
return ans;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();s = in.next();
int len = s.length();
mat a = new mat();a.m[1][1] = 1;
e = new mat();
e.m[3][1] = e.m[1][2] = e.m[2][3] = e.m[4][3] = e.m[3][4] = e.m[4][4] = 1;
mat ans = qp(a,n);
if(len == 1) {
if(s.equals("1")) {
System.out.println(ans.m[1][1]);
}
else if(s.equals("2")) {
System.out.println(ans.m[1][2]);
}
else if(s.equals("4")) {
System.out.println(ans.m[1][3]);
}
else if(s.equals("6")) {
System.out.println(ans.m[1][4]);
}
}
else if(len == 2) {
if(s.equals("26")) {
System.out.println(ans.m[1][2]);
}
else if(s.equals("16")) {
System.out.println(ans.m[1][1]);
}
else if(s.equals("64")) {
System.out.println((ans.m[1][4] - ans.m[1][1] + mo) % mo);
}
}
}
}

浙公网安备 33010602011771号