intmain(){ int n; int ret = 0; int a, b; int now; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &ar[i]); } ret = abs(ar[n] - ar[1]); a = 1; b = n; for (int i = 1; i < n; i++) { now = abs(ar[i] - ar[i + 1]); if (now < ret) { ret = now; a = i; b = i + 1; } } printf("%d %d\n", a, b); return0; }
B Sale
这题还是水,贪心,直接找到最小的 m 个加起来,注意要小于 0 的,大于等于 0 的就 break,先排序。
intmain(){ int n, m; int ret = 0; scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) { scanf("%d", &ar[i]); } sort(ar, ar + n); for (int i = 0, j = 0; i < n && j < m; i++) { if (ar[i] < 0) { j++; ret -= ar[i]; } else { break; } } printf("%d\n", ret); return0; }
voiddfs(int k, int fa){ val[k] = fa; for (int i = p[k]; i != -1; i = e[i].ne) { if (!vis[e[i].num]) { vis[e[i].num] = true; dfs(e[i].num, k); } } }
intmain(){ int n, r1, r2; int x; scanf("%d%d%d", &n, &r1, &r2); for (int i = 1; i <= n; i++) p[i] = -1; K = 0; for (int i = 1; i <= n; i++) { if (i == r1) continue; scanf("%d", &x); add(i, x); add(x, i); } vis[r2] = true; dfs(r2, 0); bool done = false; for (int i = 1; i <= n; i++) { if (i == r2) continue; if (done) putchar(' '); else done = true; printf("%d", val[i]); } puts(""); return0; }