2020年csp題解
阿新 • • 發佈:2021-10-26
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); } }