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);
            }
        }
    }
}

posted @ 2021-10-26 10:34  wtz2333  阅读(183)  评论(0)    收藏  举报