1. 程式人生 > 其它 >2020年csp題解

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帶配額的檔案系統

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