两道填空不会,一道题时间有点紧忘记判断a or b == lca 的情况了,最后一道大题暴力骗分。
仅作个人记录,代码仅供参考。
试题 C: 卡牌
#includeusing namespace std; typedef long long LL; typedef pair PII; typedef pair PLL; const int N = 2e5 + 10; LL n, m, a[N], b[N]; priority_queue , greater > pq; int main() { scanf("%lld%lld", &n, &m); for(int i = 1; i <= n; i ++ ) scanf("%lld", a + i), pq.push({a[i], i}); for(int i = 1; i <= n; i ++ ) scanf("%lld", b + i), b[i] += a[i]; while(m > 0){ LL id = pq.top().second; pq.pop(); if(a[id] == b[id]) break; a[id] ++ , m -- ; pq.push({a[id], id}); } LL ans = 9e18; for(int i = 1; i <= n; i ++ ) ans = min(ans, a[i]); printf("%lld", ans); return 0; }
试题 D: 最大数字
#includeusing namespace std; typedef long long LL; typedef pair PII; typedef pair PLL; const int N = 2e5 + 10; LL n, A, B, ans; int num[20], res[20]; int main() { scanf("%lld%lld%lld", &n, &A, &B); int siz = 0; if(n == 0) siz = 1, num[0] = 0; else{ LL t = n; while(t) num[siz] = t % 10, siz ++ , t /= 10; } for(int i = 0; i < (1 << siz); i ++ ){ memcpy(res, num, sizeof res); LL a = A, b = B, t = 0; for(int j = siz - 1; j >= 0; j -- ){ if(a == 0 && b == 0) break; if(i >> j & 1){ // 1 add 0 sub while(a && res[j] != 9) a -- , res[j] ++ ; }else{ while(b && res[j] != 9){ b -- , res[j] -- ; if(res[j] < 0) res[j] = 9; } } } for(int j = siz - 1; j >= 0; j -- ) t = t * 10 + res[j]; ans = max(ans, t); } printf("%lld", ans); return 0; }
试题 E: 出差
#includeusing namespace std; typedef long long LL; typedef pair PII; typedef pair PLL; const int N = 2e4 + 10, M = 2e4 + 10; int n, m; int he[N], ne[M], v[M], w[M], idx; int pw[N]; bool st[N]; int dis[N]; void add(int a, int b, int c){ v[idx] = b, w[idx] = c; ne[idx] = he[a], he[a] = idx ++ ; } void dij(){ for(int i = 2; i <= n; i ++ ) dis[i] = 0x3f3f3f3f; priority_queue , greater > pq; pq.push({0, 1}); while(pq.size()){ int now = pq.top().second; pq.pop(); if(st[now]) continue; st[now] = 1; for(int i = he[now]; ~i; i = ne[i]){ if(dis[v[i]] > dis[now] + w[i] + pw[v[i]]){ dis[v[i]] = dis[now] + w[i] + pw[v[i]]; pq.push({dis[v[i]], v[i]}); } } } } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++ ) he[i] = -1; for(int i = 1; i <= n; i ++ ) scanf("%d", pw + i); pw[1] = pw[n] = 0; while(m -- ){ int a, b, c; scanf("%d%d%d", &a, &b, &c); add(a, b, c), add(b, a, c); } dij(); printf("%d", dis[n]); return 0; }
试题 F: 费用报销
#includeusing namespace std; typedef long long LL; typedef pair PII; typedef pair PLL; const int N = 1e3 + 10, M = 5e3 + 10; int n, m, k; vector w[N]; int day[20] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int dp[N][M], ans; int cal(int m, int d){ int s = d; for(int i = 1; i < m; i ++ ) s += day[i]; return s; } int main() { scanf("%d%d%d", &n, &m, &k); for(int i = 1, mo, d, v, t; i <= n; i ++ ){ scanf("%d%d%d", &mo, &d, &v); if(v > m) continue; t = cal(mo, d); w[t].push_back(v); } for(int i = 1; i <= 365; i ++ ){ for(int j = 0; j <= m; j ++ ) dp[i][j] = dp[i - 1][j]; if(w[i].size()){ for(int ww : w[i]){ if(i <= k){ for(int j = ww; j <= m; j ++ ) dp[i][j] = max(dp[i][j], ww); }else{ for(int j = ww; j <= m; j ++ ) dp[i][j] = max(dp[i][j], dp[i - k][j - ww] + ww); } } } for(int j = 0; j <= m; j ++ ) ans = max(ans, dp[i][j]); } printf("%d", max(ans, dp[365][m])); return 0; }
试题 G: 故障
#includeusing namespace std; typedef long long LL; typedef pair PII; typedef pair PLL; const int N = 110, M = 5e3 + 10; int n, m, p[N], a[N][N]; bool cmp(pair a, pair b){ if(a.first != b.first) return a.first > b.first; return a.second < b.second; } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++ ) scanf("%d", p + i); for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= m; j ++ ) scanf("%d", &a[i][j]); set id; int num; scanf("%d", &num); while(num -- ){ int x; scanf("%d", &x); id.insert(x); } vector > all; for(int i = 1; i <= n; i ++ ){ bool f = 1; for(int j = 1; j <= m; j ++ ) if(!a[i][j] && id.count(j)) f = 0; if(!f) all.push_back({0, i}); else{ double res = 1; for(int j = 1; j <= m; j ++ ) if(a[i][j]){ if(id.count(j)) res = res * (a[i][j] / 100.0); else res = res * (1 - a[i][j] / 100.0); } res = res * p[i]; all.push_back({res, i}); } } sort(all.begin(), all.end(), cmp); double sum = 0; for(auto it : all) sum += it.first; if(sum == 0){ for(auto it : all) printf("%d 0.00n", it.second); }else{ for(auto it : all) printf("%d %.2fn", it.second, it.first * 100 / sum); } return 0; }
试题 H: 机房
#includeusing namespace std; typedef long long LL; typedef pair PII; typedef pair PLL; const int N = 1e5 + 10, M = 2e5 + 10, LG = 20; int n, T; int he[N], ne[M], v[M], idx; int dep[N], fa[N][LG]; LL siz[N]; void add(int a, int b){ v[idx] = b; ne[idx] = he[a], he[a] = idx ++ ; } void dfs(int now, int pre){ dep[now] = dep[pre] + 1, fa[now][0] = pre; siz[now] += siz[pre]; for(int i = 1; i < LG; i ++ ) fa[now][i] = fa[fa[now][i - 1]][i - 1]; for(int i = he[now]; ~i; i = ne[i]){ if(v[i] == pre) continue; dfs(v[i], now); } } int get_lca(int x, int y){ if(x == y) return x; if(dep[x] < dep[y]) swap(x, y); for(int i = LG - 1; i >= 0; i -- ) if(dep[fa[x][i]] >= dep[y]) x = fa[x][i]; if(x == y) return x; for(int i = LG - 1; i >= 0; i -- ) if(fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i]; return fa[x][0]; } int main() { scanf("%d %d", &n, &T); for(int i = 1; i <= n; i ++ ) he[i] = -1; for(int i = 1, a, b; i < n; i ++ ){ scanf("%d%d", &a, &b); add(a, b), add(b, a); siz[a] ++ , siz[b] ++ ; } dfs(1, 0); int a, b; LL ans; while(T -- ){ scanf("%d%d", &a, &b); int lca = get_lca(a, b); if(a == b) ans = 1; else if(a != lca && b != lca) ans = siz[a] + siz[b] - siz[lca]; else if(a == lca) ans = siz[b] - siz[fa[a][0]]; else ans = siz[a] - siz[fa[b][0]]; printf("%lldn", ans); } return 0; }
试题 I: 齿轮
#includeusing namespace std; typedef long long LL; typedef pair PII; typedef pair PLL; const int N = 2e5 + 10, M = 5e3 + 10; int n, r[N], T; bool st[N], ans[N]; set uni; int main() { scanf("%d %d", &n, &T); for(int i = 1, x; i <= n; i ++ ){ scanf("%d", &x); if(uni.count(x)) ans[1] = 1; uni.insert(x); st[x] = 1; } for(int i = 1; i < N; i ++ ) if(st[i]){ for(int k = 2; i * k < N; k ++ ) if(st[i * k]) ans[k] = 1; } int q; while(T -- ){ scanf("%d", &q); if(ans[q]) printf("YESn"); else printf("NOn"); } return 0; }
试题 J: 搬砖
#includeusing namespace std; typedef long long LL; typedef pair PII; typedef pair PLL; const int N = 110, M = 5e3 + 10; LL n, w[N], v[N]; LL ans; struct node { LL w, v, id; bool operator < (const node x) const{ return id < x.id; } }; void update(vector & vec){ sort(vec.begin(), vec.end()); do{ bool f = 1; LL sum = 0; for(int i = 0; i < vec.size(); i ++ ){ if(i == 1) sum += vec[i].w; else{ if(sum > vec[i].v){ f = 0; break; } sum += vec[i].w; } } if(f){ sum = 0; for(int i = 0; i < vec.size(); i ++ ) sum += vec[i].v; ans = max(ans, sum); } }while(next_permutation(vec.begin(), vec.end())); } int main() { cin >> n; for(int i = 0; i < n; i ++ ) cin >> w[i] >> v[i]; for(int i = 0; i < 1 << n; i ++ ){ vector vec; for(int j = 0; j < n; j ++ ) if(i >> j & 1) vec.push_back({w[j], v[j], j}); update(vec); } cout << ans; return 0; }



