1. 程式人生 > 其它 >2021年csp認證題解

2021年csp認證題解

2021年csp認證題解

202109

T1-陣列推導

簡單貪心

import java.util.Scanner;

public class Maincsp2 {//202109-1	陣列推導	100
    static int n,sum1,sum2;
    static int [] a,b = new int[1000];
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        for(int i = 1;i <= n;i ++){
            b[i] = in.nextInt();
            sum1 += b[i];
            if(b[i] != b[i - 1])sum2 += b[i];
        }
        System.out.println(sum1);
        System.out.println(sum2);
    }
}

T2-非零段劃分

一道很有意思的差分題。
考慮會出現非零段的條件,當a[i - 1] < a[i],a[i - 1]<=x<a[i]時,會貢獻一個非零段
當x >= a[i]時此非零段消失,所以通過差分可以實現此操作。

import java.util.Scanner;
import java.util.Vector;

public class Maincsp4 {//202109-2	非零段劃分
    static int n,ans,tmp;
    static int [] a = new int[500100];
    static int [] b = new int[10101];
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        for(int i = 1;i <= n;i ++) {
            a[i] = in.nextInt();
            if(a[i - 1] < a[i]){
                b[a[i - 1]] ++ ;
                b[a[i]] --;
            }
        }

        for(int i = 0;i <= 10000;i ++){
            tmp += b[i];
            ans = Math.max(ans,tmp);
        }
        System.out.println(ans);
    }
}

T3-脈衝神經網路

大模擬。這利用鄰接表進行建圖,對於當前時間下對\(N - 1\)~\(N + P - 1\)的子節點傳遞脈衝,利用一個二維陣列來記錄延遲後的時間和子節點對應的脈衝值。
考慮延遲的時間最多為1000,所以可以用迴圈陣列來減少空間。
重點是讀清題意,注意小坑。

//import java.util.ArrayList;
import java.util.Scanner;

public class Maincsp6 {//202109-3	脈衝神經網路
    static long next = 1;
    static int N,P,S,T,l;
    static double deltT,ans1,ans2;
    static double [] u = new double[1010];
    static double [] v = new double[1010];
    static double [] a = new double[1010];
    static double [] b = new double[1010];
    static double [] c = new double[1010];
    static double [] d = new double[1010];
    static double [][] I = new double[2110][1010];
    static double [] w = new double[1010];
    static int [] pre = new int[1010];
    static int [] last = new int[2010];
    static int [] other = new int[1010];
    static int [] len = new int[1010];
    static int [] r = new int[1010];
    static int [] cnt = new int[1010];
    static int myrand() {
        next = next * 1103515245 + 12345;
        return (int)((Long.divideUnsigned(next, 65536)) % 32768);
    }
    static void add(int x,int y,double z,int t){
        l ++;
        pre[l] = last[x];
        last[x] = l;
        other[l] = y;
        w[l] = z;
        len[l] = t;
    }
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        N = in.nextInt();S = in.nextInt();
        P = in.nextInt();T = in.nextInt();
        deltT = in.nextDouble();
        int tmpsum = 0;
        while(true){
            if(tmpsum == N)break;
            int R = in.nextInt();
            double V = in.nextDouble(),U = in.nextDouble(),A = in.nextDouble();
            double B = in.nextDouble(),C = in.nextDouble(),D = in.nextDouble();
            for(int i = tmpsum;i <= tmpsum + R;i ++){
                u[i] = U;v[i] = V;a[i] = A;b[i] = B;c[i] = C;d[i] = D;
            }
            tmpsum += R;
        }
        for(int i = 0;i < P;i ++){
            r[i] = in.nextInt();
        }
        for(int i = 1;i <= S;i ++){
            int s = in.nextInt(),t = in.nextInt();
            double W = in.nextDouble();int D = in.nextInt();
            add(s,t,W,D);
        }
        for(int i = 1;i <= T;i ++){
            for(int j = 0;j < P;j ++){
                int ff = myrand();
                if(r[j] > ff){
                    for(int p = last[j + N];p != 0;p = pre[p]){
                        int v1 = other[p];
                        if(i + len[p] <= T)I[(i + len[p]) % 2000][v1] += w[p];
                    }
                }
            }
            for(int j = 0;j < N;j ++){
                double tmp1 = v[j],tmp2 = u[j];
                v[j] = tmp1 + deltT * (0.04 * tmp1 * tmp1 + 5 * tmp1 + 140 - tmp2) + I[i % 2000][j];
                u[j] = tmp2 + deltT * a[j] * (b[j] * tmp1 - tmp2);
                if(v[j] >= 30){
                    v[j] = c[j];u[j] += d[j];
                    cnt[j] ++;
                    for(int p = last[j];p != 0;p = pre[p]){
                        int v1 = other[p];
                        if(i + len[p] <= T)I[(i + len[p]) % 2000][v1] += w[p];
                    }
                }
               I[i % 2000][j] = 0;
            }
        }
        ans2 = ans1 = v[0];
        int ans3 = cnt[0],ans4 = cnt[0];
        for(int i = 0;i < N;i ++) {
            ans1 = Math.max(ans1,v[i]);
            ans2 = Math.min(ans2,v[i]);
            ans3 = Math.max(ans3,cnt[i]);
            ans4 = Math.min(ans4,cnt[i]);
        }
        System.out.printf("%.3f %.3f\n",ans2,ans1);
        System.out.print(ans4 + " " + ans3);
    }
}

T4-收集卡牌

import java.util.Scanner;

public class Maincsp5 {//202109-4 收集卡牌
    static int n,k;
    static double ans;
    static double [] p = new double[20];
    static double [][] dp = new double[65550][100];
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();k = in.nextInt();
        for(int i = 1;i <= n;i ++){
            p[i] = in.nextDouble();
        }
        dp[0][0] = 1;
        for(int s = 0;s < (1 << n);s ++){
            for(int i = 0;i <= n * k;i ++){
                int cnt = 0;
                for(int j = 0;j < n;j ++)if((s & (1 << j)) != 0)cnt ++;
                if(cnt + i / k >= n){
                    ans += dp[s][i] * (cnt + i);
                    continue;
                }
                for(int j = 0;j < n;j ++){
                    if((s & (1 << j)) != 0) {
                        dp[s][i + 1] += dp[s][i] * p[j + 1];
                   //     System.out.println(dp[s][i]);
                    }
                    else dp[s|(1 << j)][i] += dp[s][i] * p[j + 1];
                }
            }
        }
        System.out.printf("%.10f",ans);
    }
}

202104

T1-灰度直方圖

簡單模擬

import java.util.Scanner;

public class Maincsp1 {//202104-1	灰度直方圖
    static int n,m,l;
    static int [][] a = new int[510][510];
    static int [] h = new int [300];
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();l = in.nextInt();
        for(int i = 1;i <= n;i ++){
            for(int j = 1;j <= m;j ++){
                a[i][j] = in.nextInt();
                h[a[i][j]] ++;
            }
        }
        for(int i = 0;i < l;i ++){
            System.out.print(h[i] + " ");
        }
    }
}

T2-鄰域均值

簡單二維字首和

import java.util.Scanner;

public class Maincsp3 {//202104-2	鄰域均值
    static int n,l,t,r,ans;
    static int [][] a = new int[610][610];
    static int [][] sum = new int[610][610];
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();l = in.nextInt();
        r = in.nextInt();t = in.nextInt();
        for(int i = 1;i <= n;i ++){
            for(int j = 1;j <= n;j ++) {
                a[i][j] = in.nextInt();
                sum[i][j] = sum[i][j - 1] + sum[i - 1][j] + a[i][j] - sum[i - 1][j - 1];
            }
        }
        for(int i = 1;i <= n;i ++){
            for(int j = 1;j <= n;j ++){
                int x = Math.max(i - r,1);
                int y = Math.max(j - r,1);
                int xx = Math.min(i + r,n);
                int yy = Math.min(j + r,n);
                int tmp = sum[xx][yy] - sum[xx][y - 1] - sum[x - 1][yy] + sum[x - 1][y - 1];
                if(t * (xx - x + 1) * (yy - y + 1) >= tmp)ans ++;
            }
        }
        System.out.println(ans);
    }

}

T3-DHCP伺服器

T4-校門外的樹

import java.util.ArrayList;
import java.util.Scanner;

public class Maincsp7 {//202104-4	校門外的樹
    static int n;
    static final long mo = 1000000007;
    static int [] a = new int[1010];
    static int [] vis = new int[100010];
    static long [] dp = new long[1010];
    static ArrayList<Integer> p[];
    static long solve(int x,int y){
        long cnt = 0;
        int len = a[x] - a[y];
       // System.out.println(x + " " + y);
        vis[len] = 1;
        for(Integer i:p[len]){
            if(vis[i] == 1){
                continue;
            }
            else {
                cnt ++;vis[i] = 1;
            }
        }
        //System.out.println(cnt);
        return cnt;
    }
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        for(int i = 1;i <= n;i ++){
            a[i] = in.nextInt();
        }
        p = new ArrayList[100010];
        for(int i = 1;i <= a[n];i ++){
            p[i] = new ArrayList<Integer>();
            p[i].add(1);
            for(int j = 2;j <= Math.sqrt(i);j ++){
                if(i % j == 0){
                    p[i].add(j);
                    if(j != i / j)p[i].add(i / j);
                }
            }
        }
        dp[1] = 1;
        for(int i = 2;i <= n;i ++){
            for(int j = i - 1;j >= 1;j --){
                dp[i] = (dp[i] + dp[j] * solve(i,j) % mo) % mo;
            }
            for(int j = 1;j <= a[n];j ++)vis[j] = 0;
        }
        System.out.println(dp[n]);
    }
}