/** * Author: Tang Qiao */ #include<bits/stdc++.h> usingnamespace std; int n, m; char tu[105][105]; int ans; int movex[8] = {0, 0, 1, -1, 1, 1, -1, -1}; int movey[8] = {1, -1, 0, 0, 1, -1, 1, -1};
voiddfs(int x, int y){ tu[x][y] = '.'; for (int i = 0; i < 8; i++) { int nx = x + movex[i]; int ny = y + movey[i]; if (nx < 0 || nx >= n || ny < 0 || ny >= m || tu[nx][ny] != 'W') continue; dfs(nx, ny); } }
intmain(){ cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> tu[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (tu[i][j] == 'W') { dfs(i, j); ans++; } } } cout << ans << endl; return0; }
// 行列唯一性检查 boolfinal_check(){ set<int> row_set, col_set; for (int i = 0; i < 6; i++) { int v = 0; for (int j = 0; j < 6; ++j) { v = v * 10 + (tu[i][j] - '0'); } row_set.insert(v); } if (row_set.size() != 6) returnfalse; for (int j = 0; j < 6; ++j) { int v = 0; for (int i = 0; i < 6; ++i) { v = v * 10 + (tu[i][j] - '0'); } col_set.insert(v); } if (col_set.size() != 6) returnfalse; returntrue; }
voiddfs(int r, int c); voidtry_dfs(int r, int c){ char ch = tu[r][c]; row_cnt[r][ch - '0']++; col_cnt[c][ch - '0']++; if (check(r, c)) { int nr = r; int nc = c + 1; if (nc == 6) { nr++; nc = 0; } dfs(nr, nc); } row_cnt[r][ch - '0']--; col_cnt[c][ch - '0']--; }
voiddfs(int r, int c){ if (r == 6) { if (final_check()) { for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { cout << tu[i][j]; } } cout << endl; // 因为只有一个合法解,所以找到答案就退出 exit(0); } return; } if (mark[r][c] == 0) { tu[r][c] = '1'; try_dfs(r, c); tu[r][c] = '0'; try_dfs(r, c); } else { tu[r][c] = mark[r][c]; try_dfs(r, c); } }
intmain(){ cin >> n; for (int i = 0; i < n; ++i) { v[i] = i+1; } do { for (int i = 0; i < n; ++i) { printf("%5d", v[i]); } printf("\n"); } while (next_permutation(v, v+n)); return0; }
intmain(){ cin >> n >> r; for (int i = r; i < n; ++i) { v[i] = 1; } do { for (int i = 0; i < n; ++i) { if (v[i] == 0) printf("%3d", i+1); } printf("\n"); } while (next_permutation(v, v+n)); return0; }
intmain(){ int n, m; cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { char ch; cin >> ch; cnt[i][ch]++; } } int ans = INT_MAX; // 枚举蓝色行的起止 for (int i = 1; i < n; ++i) { for (int j = i; j < n-1; ++j) { int cost = 0; for (int k = 0; k < i; ++k) cost += m - cnt[k]['W']; for (int k = i; k <= j; ++k) cost += m - cnt[k]['B']; for (int k = j+1; k < n; ++k) cost += m - cnt[k]['R']; ans = min(ans, cost); } } cout << ans << endl; return0; }
boolcheck(int x, int y, int dx, int dy){ int nx = x, ny = y; for (int i = 0; i < k; i++) { if (nx >= n || ny >= m) returnfalse; if (tu[nx][ny] == '#') returnfalse; nx += dx; ny += dy; } returntrue; }
intmain(){ ios::sync_with_stdio(false); cin >> n >> m >> k; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> tu[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (check(i, j, 1, 0)) ans++; if (check(i, j, 0, 1)) ans++; } } if (k == 1) ans /= 2; cout << ans << endl; return0; }
int n, m; char tu[110][110]; int movex[] = {-1, -1, -1, 0, 0, 1, 1, 1}; int movey[] = {-1, 0, 1, -1, 1, -1, 0, 1};
intmain(){ cin >> n >> m; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cin >> tu[i][j]; } }
for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (tu[i][j] == '*') continue; int cnt = 0; for (int k = 0; k < 8; ++k) { int x = i + movex[k]; int y = j + movey[k]; if (tu[x][y] == '*') cnt++; } tu[i][j] = cnt + '0'; } }
for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cout << tu[i][j]; } cout << endl; } return0; }
boolcheck(int i, int j){ // 检查上方格子 if (i > 1 && a[i-1][j] == y) returntrue; // 检查下方格子 if (i < n && a[i+1][j] == y) returntrue; // 检查左侧格子 if (j > 1 && a[i][j-1] == y) returntrue; // 检查右侧格子 if (j < m && a[i][j+1] == y) returntrue; returnfalse; }
intmain(){ ios::sync_with_stdio(false); cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> a[i][j]; } } cin >> x >> y; int count = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (a[i][j] == x && check(i, j)) { count++; } } } cout << count << endl; return0; }
int n, m, k, ans; int s[110][110]; // 表示从(0,0)到(a,b)的 1 的个数 char tu[110][110];
intmain(){ cin >> n >> m >> k; for (int i = 1; i <= n; i++) { cin >> tu[i]+1; } // 从第二行递推 for (int i = 1; i <= n; i++) { int cnt = 0; for (int j = 1; j <= m; j++) { cnt += (tu[i][j] == '1'); s[i][j] = s[i-1][j] + cnt; } } ans = INT_MAX; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { for (int a = i; a <= n; a++) { for (int b = j; b <= m; b++) { int cnt = s[a][b] - s[i-1][b] - s[a][j-1] + s[i-1][j-1]; if (cnt >= k) { int tmp = (a-i+1) * (b-j+1); if (tmp < ans) ans = tmp; } } } } } if (ans == INT_MAX) cout << 0 << endl; else cout << ans << endl; return0; }
intmain(){ int n, m; cin >> n >> m; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } int current = 0; for (int i = 0; i < m; i++) { int step = a[current] % n; current = (current - step + n) % n; } cout << current + 1 << endl; return0; }
voidmark(int x, int y, int size){ if (size == 1) return; int half = size/2; for (int i = x; i < x+half; ++i) { for (int j = y; j < y+half; ++j) { v[i][j] = '0'; } } mark(x, y+half, half); mark(x+half, y, half); mark(x+half, y+half, half); }
intmain(){ cin >> n; m = 1<<n; memset(v, '1', sizeof(v)); mark(0, 0, m); for (int i = 0; i < m; ++i) { for (int j = 0; j < m; ++j) { cout << v[i][j] << " "; } cout << endl; } return0; }
int n, x, y, order; int tu[15][15]; int movex[] = {0, 1, 0, -1}; int movey[] = {1, 0, -1, 0}; intmain(){ cin >> n; memset(tu, 0, sizeof(tu)); x = 1; y = 0; order = 0; for (int i = 1; i <= n*n; i++) { int nx = x + movex[order]; int ny = y + movey[order]; if (nx < 1 || nx > n || ny < 1 || ny > n || tu[nx][ny] != 0) { order = (order + 1) % 4; nx = x + movex[order]; ny = y + movey[order]; } x = nx; y = ny; tu[x][y] = i; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { printf("%3d", tu[i][j]); } printf("\n"); } return0; }
#define MAXN 510 int f[MAXN][MAXN], g[MAXN][MAXN]; int n, m; intmain(){ cin >> n >> m; int cnt = 1; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { f[i][j] = cnt++; } } for (int i = 1; i <=m; ++i) { int x, y, r, z; cin >> x >> y >> r >> z; if (z == 0) { for (int a = x-r; a <= x+r; ++a) for (int b = y-r; b <= y+r; ++b) g[b-y+x][x-a+y]=f[a][b];
} else { for (int a = x-r; a <= x+r; ++a) for (int b = y-r; b <= y+r; ++b) g[y-b+x][a-x+y]=f[a][b]; } for (int a = x-r; a <= x+r; ++a) for (int b = y-r; b <= y+r; ++b) f[a][b] = g[a][b]; } // end of m for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << f[i][j] << " "; } cout << endl; } return0; }
boolmatch(char a[12][12], char b[12][12]){ for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { if (a[x][y] != b[x][y]) returnfalse; } } returntrue; }
voidprint(char a[12][12]){ for (int i = 0; i < n; ++i) { cout << a[i] << endl; } }
intmain(){ cin >> n; for (int i = 0; i < n; ++i) { cin >> ori[i]; } for (int i = 0; i < n; ++i) { cin >> dest[i]; } // 方案一 for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { tmp[y][n-x-1] = ori[x][y]; } } if (debug) { cout << "debug 1: " << endl; print(tmp); } if (match(tmp, dest)) { cout << "1" << endl; return0; } // 方案二 for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { tmp2[y][n-x-1] = tmp[x][y]; } } if (match(tmp2, dest)) { cout << "2" << endl; return0; } // 方案三 for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { tmp[y][n-x-1] = tmp2[x][y]; } } if (match(tmp, dest)) { cout << "3" << endl; return0; } // 反射 for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { tmp[x][n-y-1] = ori[x][y]; } } if (match(tmp, dest)) { cout << "4" << endl; return0; } // 反射+旋转90 for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { tmp2[y][n-x-1] = tmp[x][y]; } } if (debug) { cout << "debug 5-1: " << endl; print(tmp2); } if (match(tmp2, dest)) { cout << "5" << endl; return0; } // 反射+旋转180 for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { tmp[y][n-x-1] = tmp2[x][y]; } } if (debug) { cout << "debug 5-2: " << endl; print(tmp); } if (match(tmp, dest)) { cout << "5" << endl; return0; } // 反射+旋转270 for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { tmp2[y][n-x-1] = tmp[x][y]; } } if (debug) { cout << "debug 5-3: " << endl; print(tmp2); } if (match(tmp2, dest)) { cout << "5" << endl; return0; } // 不改变 if (match(ori, dest)) { cout << "6" << endl; return0; } cout << "7" << endl; return0; }
int n, m, tot, ans; int p1, p2; int v[3300]; intmain(){ cin >> n >> m; for (int i = 0; i < n; ++i) { cin >> v[i]; } // 初使化滑动窗口 tot = 0; for (int i = 0; i < m; ++i) { tot += v[i]; } ans = tot; p1 = 0; p2 = m; // 滑动窗口,更新值 while (p2 < n) { tot -= v[p1]; tot += v[p2]; ans = min(ans, tot); p1++; p2++; } cout << ans << endl; return0; }
intfind(int a){ if (p[a] == a) return a; return p[a] = find(p[a]); }
voidmerge(int a, int b){ int pa = find(a); int pb = find(b); p[pa] = pb; }
intmain(){ int a, b; // 初始化 for (int i = 0; i < 5010; ++i) { p[i] = i; } scanf("%d%d%d", &n, &m, &q); for (int i = 0; i < m; ++i) { scanf("%d%d", &a, &b); merge(a, b); } for (int i = 0; i < q; ++i) { scanf("%d%d", &a, &b); if (find(a) == find(b)) printf("Yes\n"); elseprintf("No\n"); } return0; }
intfind(int a){ if (p[a] == a) return a; return p[a] = find(p[a]); }
voidmerge(int a, int b){ int pa = find(a); int pb = find(b); p[pa] = pb; }
voidinit(){ for (int i = 0; i <= n ; ++i) { p[i] = i; } }
intmain(){ while (1) { scanf("%d", &n); if (n == 0) break; init(); scanf("%d", &m); for (int i = 0; i < m; ++i) { int a, b; scanf("%d%d", &a, &b); merge(a, b); } int cnt = 0; for (int i = 1; i <=n ; ++i) { int pa = find(i); if (pa == i) { cnt++; } } printf("%d\n", cnt-1); } return0; }
// 二分查找 int left, right, mid, ans; left = 1; right = n; ans = -1; while (left <= right) { mid = left + (right-left) / 2; if (v[mid] > a) { right = mid - 1; } elseif (v[mid] < a) { left = mid + 1; } else { ans = mid; break; } } cout << ans << " ";
int v[1000010]; int n, m, a; intmain(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) scanf("%d", v+i); while (m--) { scanf("%d", &a); int left, right, mid, ans; left = 1; right = n; ans = -1; while (left <= right) { mid = left + (right-left)/2; if (v[mid] > a) { right = mid - 1; } elseif (v[mid] < a) { left = mid + 1; } else { // 如果找到,则比较 ans 的值,更新它 if (ans == -1 || ans > mid) ans = mid; right = mid - 1; } } cout << ans << " "; } cout << endl; return0; }
int v[1000010]; int n, m, a; intmain(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) scanf("%d", v+i); while (m--) { scanf("%d", &a); int l, r, mid; l = 1; r = n+1; while (l < r) { mid = l + (r-l)/2; if (a > v[mid]) l = mid + 1; else r = mid; } if (l < n+1 && v[l] == a) cout << l << " "; else cout << -1 << " "; } cout << endl; return0; }
如果记不清楚,就分开写:
如果猜对了但要找最小值,就更新 r
如果 mid 大了,则答案在 mid 左侧,就更新 r
如果 mid 小了,则答案在 mid 右侧,就更新 l
另外,以上这种代码其实是不停在[l,mid) 和 [mid+1, r)之间做选择,所以:
l 只会更新成 mid+1
r 只会更新成 mid
最后答案如果有,则在 l 位置,当然 l 位置也可能不是答案:
如果目标极小,没找到,则 l 位置为查找的范围最左侧下标
如果目标极大,没找到,则 l 位置为最初的 r 的位置(那个位置是最后一个元素的下一个位置,直接读取会数组越界)
lower_bound
其实上面那个写法就是 C++ STL 里面的 lower_bound 函数,所以我们可以直接用 lower_bound 函数来实现 P2249 题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include<bits/stdc++.h> usingnamespace std;
int v[1000010]; int n, m, a; intmain(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) scanf("%d", v+i); while (m--) { scanf("%d", &a); int l = lower_bound(v+1, v+n+1, a) - v; if (l < n+1 && v[l] == a) cout << l << " "; else cout << -1 << " "; } cout << endl; return0; }
函数 lower_bound 在 [first,last) 中的前闭后开区间进行二分查找,返回大于或等于目标值的第一个元素位置。如果所有元素都小于目标值,则返回 last 的位置。
// 如果目标值等于或者小于 mid,则 r = m // 如果目标值大于 mid,则 l = m+1 intlower_bound(int a){ int l, r; l = 0; r = n; while (l < r) { int m = l + (r-l)/2; if (a > v[m]) l = m+1; else r = m; } return l; }
// 如果 mid 值小于等于目标,就 l=m+1 // 如果 mid 值大于目标,就 r=m intupper_bound(int a){ int l, r; l = 0; r = n; while (l < r) { int m = l + (r-l)/2; if (a >= v[m]) l = m+1; else r = m; } return l; }
intmain(){ scanf("%d%d", &m, &n); for (int i = 0; i < m; ++i) scanf("%d", vm+i); sort(vm, vm+m); for (int i = 0; i < n; ++i) { scanf("%d", &a); int diff = INT_MAX; int idx = upper_bound(vm, vm+m, a)-vm; if (idx != m) diff = min(diff, abs(vm[idx]-a)); if (idx - 1 >=0 ) diff = min(diff, abs(vm[idx-1]-a)); ans += diff; } cout << ans << endl; return0; }
int n, k; int v[100010]; boolcheck(int mid){ int cnt = 0; for (int i = 0; i < n; ++i) { cnt += v[i]/mid; if (cnt >= k) returntrue; } returnfalse; } intmain(){ scanf("%d%d", &n, &k); for (int i = 0; i < n; ++i) { scanf("%d", v+i); } int left = 1; int right = (int)1e8; int ans = 0; while (left <= right) { int mid = (left + right) / 2; if (check(mid)) { left = mid + 1; ans = max(ans, mid); } else { right = mid - 1; } } cout << ans << endl; return0; }
P2678 跳石头
二分答案:用 mid 去试跳,如果间距小于 mid,则去掉那个石头,如果去掉个数超过 k 个,则失败。
int n, m, v[100010]; boolcheck(int mid){ int tot = 0; int cnt = 0; for (int i = 0; i < n; ++i) { cnt += v[i]; if (v[i] > mid) returnfalse; if (cnt > mid) { tot++; cnt = 0; i--; } } if (cnt != 0) tot++; if (tot <= m) returntrue; elsereturnfalse; }
intmain(){ scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%d", v+i); } int left = 1; int right = (int)(1e9 + 1); int ans = INT_MAX; while (left <= right) { int mid = (left+right)/2; if (check(mid)) { ans = min(ans, mid); right = mid - 1; } else { left = mid + 1; } } cout << ans << endl; return0; }
int r, c; int tu[110][110]; int dp[110][110]; int movex[]={-1,1,0,0}; int movey[]={0,0,-1,1}; bool debug = false;
structNode { int x, y, h; Node(int _x, int _y, int _h) { x = _x; y = _y; h = _h; } }; booloperator<(Node a, Node b) { return a.h < b.h; } vector<Node> v;
intmain(){ scanf("%d%d", &r, &c); v.reserve(r*c); for (int i = 0; i < r; ++i) { for (int j = 0; j < c; ++j) { scanf("%d", &tu[i][j]); v.push_back(Node(i, j, tu[i][j])); } } sort(v.begin(), v.end()); memset(dp, 0, sizeof(dp)); int ans = 0; for (int i = 0; i < r*c; ++i) { Node node = v[i]; int x = node.x; int y = node.y; for (int j = 0; j < 4; ++j) { int tox = x + movex[j]; int toy = y + movey[j]; if (tox >=0 && tox <r && toy >=0 && toy<c && node.h > tu[tox][toy]) { dp[x][y] = max(dp[x][y], dp[tox][toy]); } } dp[x][y] += 1; ans = max(ans, dp[x][y]); if (debug) { printf("dp[%d][%d]=%d\n", x, y, dp[x][y]); } } printf("%d\n", ans); return0; }
intdfs(int x, int y){ if (rem[x][y] != 0) return rem[x][y]; int mm = 0; for (int i = 0; i < 4; ++i) { int tox = x + movex[i]; int toy = y + movey[i]; if (tox >=0 && tox <r && toy >=0 && toy<c && tu[x][y] > tu[tox][toy]) { mm = max(mm, dfs(tox, toy)); } } return (rem[x][y] = mm + 1); }
intmain(){ scanf("%d%d", &r, &c); for (int i = 0; i < r; ++i) { for (int j = 0; j < c; ++j) { scanf("%d", &tu[i][j]); } } int ans = 0; for (int i = 0; i < r; ++i) { for (int j = 0; j < c; ++j) { ans = max(ans, dfs(i, j)); } } printf("%d\n", ans); return0; }
intmain(){ scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", v+i); } int cnt = 0; int ans = -1e9; for (int i = 0; i < n; ++i) { cnt += v[i]; ans = max(ans, cnt); if (cnt < 0) cnt = 0; } printf("%d\n", ans); return0; }
int n, m; vector<vector<int> > v; int r[5010], out[5010];
intdfs(int a){ if (r[a] != -1) return r[a]; // 如果是头部,算一种情况 if (v[a].size() == 0) return (r[a]=1); // 如果不是头部,则求和 int cnt = 0; for (int i = 0; i < v[a].size(); ++i) { cnt = (cnt + dfs(v[a][i])) % MOD; } return r[a] = cnt; }
intmain(){ memset(r, -1, sizeof(r)); scanf("%d%d", &n, &m); v.resize(n+1); for (int i = 0; i < m; ++i) { int a, b; scanf("%d%d", &a, &b); v[a].push_back(b); // a 被 b 吃 out[b]++; // b 的出度+1 } int ans = 0; for (int i = 1; i <=n ; ++i) { // 如果 i 出度为 0,就表示只能被吃,为底部 if (out[i] == 0) { ans += dfs(i); ans %= MOD; } } printf("%d\n", ans); return0; }
int n, m; int w[3500], v[3500], dp[14000]; intmain(){ scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%d%d", w+i, v+i); } memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; ++i) { for (int j = m; j>=w[i]; --j) { dp[j] = max(dp[j], dp[j-w[i]] + v[i]); } } printf("%d\n", dp[m]); return0; }
voiddfsAns(int pt, int n, int cnt){ if (pt == n) { int tmp = max(cnt, tot-cnt); ret = min(ret, tmp); return; } dfsAns(pt+1, n, cnt); dfsAns(pt+1, n, cnt+v[pt]); }
intmain(){ scanf("%d%d%d%d", s, s+1, s+2, s+3); for (int i = 0; i < 4; ++i) { memset(v, 0, sizeof(v)); tot = 0; for (int j = 0; j < s[i]; ++j) { scanf("%d", v+j); tot += v[j]; } ret = tot; dfsAns(0, s[i], 0); ans += ret; } printf("%d\n", ans); return0; }
intdpAns(int n){ int cnt = 0; for (int i = 0; i < n; ++i) { cnt += v[i]; } int m = cnt / 2; memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; ++i) { for (int j = m; j>=v[i]; --j) { dp[j] = max(dp[j], dp[j-v[i]] + v[i]); } } int ret = max(dp[m], cnt - dp[m]); return ret; }
intmain(){ scanf("%d%d%d%d", s, s+1, s+2, s+3); for (int i = 0; i < 4; ++i) { memset(v, 0, sizeof(v)); for (int j = 0; j < s[i]; ++j) { scanf("%d", v+j); } ans += dpAns(s[i]); } printf("%d\n", ans); return0; }
structLine{ int left, right; }; booloperator<(Line a, Line b) { if (a.left != b.left) return a.left < b.left; return a.right < b.right; } int n, ans; Line v[1000010];
intmain(){ scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d%d", &v[i].left, &v[i].right); } sort(v, v+n); ans = 0; int border = 0; for (int i = 0; i < n; ++i) { if (v[i].left >= border) { ans++; border = v[i].right; } else { border = min(border, v[i].right); } } printf("%d\n", ans); return0; }
structLine{ int left, right; }; booloperator<(Line a, Line b) { if (a.right != b.right) return a.right < b.right; return a.left < b.left; } int n, ans; Line v[1000010];
intmain(){ scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d%d", &v[i].left, &v[i].right); } sort(v, v+n); ans = 0; int border = -1; for (int i = 0; i < n; ++i) { if (border <= v[i].left) { ans++; border = v[i].right; } } printf("%d\n", ans); return0; }
intmain(){ scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", v+i); } ans = v[0]; for (int i = 1; i < n; ++i) { if (v[i]>v[i-1]) { ans += v[i] - v[i-1]; } } cout << ans << endl; return0; }
structGame { int time; int reward; }; Game games[510]; int mark[510];
booloperator<(const Game &a, const Game &b) { return a.reward > b.reward; }
intmain(){ int n; cin >> n; for (int i = 0; i < n; i++) { cin >> games[i].time; } for (int i = 0; i < n; i++) { cin >> games[i].reward; } sort(games, games + n); int ans = 0; for (int i = 0; i < n; i++) { for (int j = games[i].time; j >= 1; j--) { if (!mark[j]) { mark[j] = 1; ans += games[i].reward; break; } } } cout << ans << endl; return0; }
int N,M; char tu[310][310]={0}; bool flag[310][310]={0}; structNode { int x, y; Node() {x=y=0;} Node(int _x, int _y) {x = _x; y=_y;} }; Node st; int movex[]={-1,1,0,0}; int movey[]={0,0,-1,1};
booloperator==(Node a, Node b) { return a.x == b.x && a.y == b.y; }
Node getNode(char ch){ for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { if (tu[i][j] == ch) { returnNode(i,j); } } } returnNode(0, 0); }
Node getOtherNode(char ch, int x, int y){ for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { if (x == i && y == j) continue; if (tu[i][j] == ch) { returnNode(i,j); } } } returnNode(0, 0); }
intbfs(Node a){ queue<pair<Node, int> > q; q.push(make_pair(a, 0)); flag[a.x][a.y] = true; while (!q.empty()) { pair<Node, int> one = q.front(); q.pop(); a = one.first; int step = one.second; char ch = tu[a.x][a.y]; if (ch >= 'A' && ch <='Z') { a = getOtherNode(ch, a.x, a.y); } elseif (ch == '=') { return step; } for (int i = 0; i < 4; ++i) { int tox = a.x + movex[i]; int toy = a.y + movey[i]; if (tox>=0 && tox<N && toy>=0 && toy<M && tu[tox][toy] != '#' && !flag[tox][toy]) { q.push(make_pair(Node(tox, toy), step+1)); flag[tox][toy] = true; } } } return0; }
intmain(){ scanf("%d%d", &N, &M); for (int i = 0; i < N; ++i) { scanf("%s", tu[i]); } Node st = getNode('@'); printf("%d\n", bfs(st)); return0; }
int n, m, ans = 0; char tu[110][110]={0}; bool flag[110][110]={false}; int movex[]={-1,1,0,0}; int movey[]={0,0,-1,1}; voidbfs(int x, int y){ queue<int> q;
q.push(x); q.push(y); flag[x][y] = true; while (!q.empty()) { x = q.front(); q.pop(); y = q.front(); q.pop();
for (int i = 0; i < 4; ++i) { int tox = x + movex[i]; int toy = y + movey[i]; if (tox >= 0 && tox < n && toy >= 0 && toy < m && tu[tox][toy]!='0' && flag[tox][toy]==false) { flag[tox][toy] = true; q.push(tox); q.push(toy); } } } }
intmain(){ scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%s", tu[i]); } for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (tu[i][j] != '0' && flag[i][j] == false) { bfs(i, j); ans++; } } } printf("%d\n", ans); return0; }
int m; // -1 表示可以行走,非 -1 表示在第 i 时刻变成焦土 int tu[310][310]; bool vis[310][310]; int movex[] = {0, 0, 0, 1, -1}; int movey[] = {0, 1, -1, 0, 0}; structNode { int x, y, t; Node(int _x, int _y, int_t) : x(_x), y(_y), t(_t) {} };
voidmark(int x, int y, int t){ for (int i = 0; i < 5; i++) { int nx = x + movex[i]; int ny = y + movey[i]; if (nx >= 0 && ny >= 0) { if (tu[nx][ny] == -1) tu[nx][ny] = t; else tu[nx][ny] = min(tu[nx][ny], t); } } }
voidbfs(){ queue<Node> q; q.push(Node(0, 0, 0)); vis[0][0] = true; while (!q.empty()) { Node node = q.front(); q.pop(); if (tu[node.x][node.y] == -1) { cout << node.t << endl; return; } for (int i = 1; i < 5; i++) { int nx = node.x + movex[i]; int ny = node.y + movey[i]; if (nx >= 0 && ny >= 0 && !vis[nx][ny]) { if (tu[nx][ny] == -1) { cout << node.t + 1 << endl; return; } if (tu[nx][ny] > node.t + 1) { vis[nx][ny] = true; q.push(Node(nx, ny, node.t + 1)); } } } } cout << -1 << endl; }
intmain(){ memset(tu, -1, sizeof(tu)); cin >> m; for (int i = 0; i < m; i++) { int x, y, t; cin >> x >> y >> t; mark(x, y, t); } bfs(); return0; }
/** * 此题 m 的量很大,所以要提前算出答案。 */ #include<bits/stdc++.h> usingnamespace std;
int n, m; char tu[1100][1100]; int flag[1100][1100]; vector<int> ans; int movex[]={1,-1,0,0}; int movey[]={0,0,-1,1}; bool debug=true;
charconvert(char ch){ if (ch == '0') return'1'; elsereturn'0'; }
intmark(int x, int y, int v){ int cnt = 0; queue<pair<int,int> > q; q.push(make_pair(x, y)); cnt++; flag[x][y] = v; while (!q.empty()) { pair<int, int> a = q.front(); q.pop(); x = a.first; y = a.second; char ch = convert(tu[x][y]); for (int i = 0; i < 4; ++i) { int tox = x + movex[i]; int toy = y + movey[i]; if (tox >=0 && toy >=0 && tox <n && toy<n &&tu[tox][toy]==ch &&flag[tox][toy]==-1) { q.push(make_pair(tox, toy)); cnt++; flag[tox][toy] = v; } } } return cnt; }
voidprocess(){ for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j){ flag[i][j] = -1; } } int idx = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (flag[i][j] == -1) { // 标记 idx int cnt = mark(i, j, idx); // 把标为 idx 的个数放到 ans 数组中 ans.push_back(cnt); idx++; } } } }
intmain(){ scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%s", tu[i]); } process(); for (int i = 0; i < m; ++i) { int x, y; scanf("%d%d", &x, &y); int idx = flag[x-1][y-1]; printf("%d\n", ans[idx]); } return0; }
2、在上一步的结果中,寻找 include <...> search starts here 那一行,在那一行后面有提供 5 个路径,找到中间那个路径,按住 cmd 点击,可以用鼠标打开那个路径。如下图:
3、找开之后,在那个路径新建名为 bits 的文件夹。
4、进入 bits文件夹,随便粘贴一个头文件进去,然后改名为 stdc++.h,修改文件内容如下:
// C++ includes used for precompiling -*- C++ -*-
// Copyright (C) 2003-2014 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version.
// This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details.
// Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation.
// You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // <http://www.gnu.org/licenses/>.
/** @file stdc++.h * This is an implementation file for a precompiled header. */
我们在这个 for 循环中实现了递推算法。递推是一个对新手来说很“神奇”的计算机算法,对于初学者来说,斐波那契数是最佳的一个学习例题,因为代码可以非常短。容易理解递推的核心思想。
示例代码:
#include<iostream> usingnamespace std; intmain(){ int a=1, b=1, c=1; int n; cin >> n; for(int i = 1; i <= n-2; i++){ c = b+a; a = b; b = c; } cout << c << endl; return0; }