京东 3.19 笔试
1. 坦克炸碉堡
import java.util.Arrays; import java.util.Scanner; public class Main2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // tankNum:坦克数量 // life:碉堡生命值 // boomNum:一座碉堡炸毁 c 辆坦克 // baseNum 碉堡数量 int tankNum = scanner.nextInt(), life = scanner.nextInt(), boomNum = scanner.nextInt(), baseNum = scanner.nextInt(); // round:回合数 int round = 0; // 样例 // 10 6 8 2 // 2 int index = 0; int[] a = new int[baseNum]; Arrays.fill(a, life); // 每一回合炸毁尽量多的碉堡 while(tankNum > 0 && index < baseNum){ ++round; int fire = tankNum; while(fire > 0 && index < baseNum){ if(fire >= a[index]){ fire -= a[index]; a[index] = 0; index++; }else{ a[index] -= fire; fire = 0; } } tankNum -= (baseNum - index) * boomNum; } if(a[baseNum - 1] <= 0){ System.out.print(round); }else{ System.out.print(-1); } } }
2. 起重机最大重量
// 使用最小生成树思想 // 1. 将所有边排序,按称重从小到大 // 2. 每次选择一条边,假如边会使树成环则丢弃 // 3. 所有点都存在树中时,即可停止添加 // 4. 选择这些边中称重最小的即为答案 #include<bits/stdc++.h> using namespace std; int f[1010]; struct position { int x; int y; int v; }; bool cmp(position p1, position p2) { return p1.v > p2.v; } int find(int root) { int node = root; while(root != f[root]) { root = f[root]; } while(node != root) { int t = f[node]; f[node] = root; node = t; } return root; } int main() { int n, m; cin>>n>>m; for(int i = 1; i <= n; i++) { f[i] = i; } int minn = 1e8; int a[n + 1][n + 1] = {0}; bool b[n + 1] = {false}; position positions[m]; int sum = 0; for(int i = 0; i < m; i++) { int x, y, v; cin>>positions[i].x>>positions[i].y>>positions[i].v; } sort(positions, positions + m, cmp); for(int i = 0; i < m; i++) { int x = positions[i].x; int y = positions[i].y; int fx = find(x); int fy = find(y); if(fx != fy) { minn = min(minn, positions[i].v); f[fx] = fy; if(!b[x]) { b[x] = true; sum++; } if(!b[y]) { b[y] = true; sum++; } } if(sum >= n) { break; } } cout<<minn; }