赞
踩
由于时间原因, 只提供代码和大概思路 (我代码中可能有很多没用到的东西, 不用奇怪)
我的代码里有很多偷懒的语法, 不明白的可以查一下
模拟
//#include <bits/stdc++.h> #include <iostream> #include <cstring> #include <cmath> #include <vector> #include <string> #include <map> #include <set> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define VI vector<int> #define PII pair<int, int> #define int long long #define sz() ((int)a.size()) #define LL long long using namespace std; const int N = 1e6 + 10, M = N * 2; int n, m; int a[N]; void solve() { char op; cin >> n >> op >> m; if (op == '+') { cout << n + m; } else if (op == '-'){ cout << n - m; } else if (op == '*') { cout << n * m; } else { cout << "error"; } } signed main() { IOS; int T = 1; // cin >> T; while (T --) solve(); return 0; }
模拟 (真的恶心)
//#include <bits/stdc++.h> #include <iostream> #include <cstring> #include <cmath> #include <vector> #include <string> #include <map> #include <set> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define VI vector<int> #define PII pair<int, int> #define int long long #define sz() ((int)a.size()) #define LL long long using namespace std; const int N = 1e6 + 10, M = N * 2; const double eps = 1e-5; int n, m; int a[N]; void print(double a, double b) { printf("salary=%.2f,tax=%.2f", a, b); } void solve() { double s; cin >> s; if (s <= 12 * 5000) { print(s, 0); return; } double r = s; s -= 12 * 5000; if (s <= 36000) { print(r, s * 0.03); } else if (s <= 144000) { print(r, 36000.0 * 0.03 + (s - 36000) * 0.1); } else if (s <= 300000) { print(r, 36000.0 * 0.03 + (144000 - 36000) * 0.1 + (s - 144000) * 0.2); } else if (s <= 420000) { print(r, 36000.0 * 0.03 + (144000 - 36000) * 0.1 + (300000 - 144000) * 0.2 + (s - 300000) * 0.25); } else if (s <= 660000) { print(r, 36000.0 * 0.03 + (144000 - 36000) * 0.1 + (300000 - 144000) * 0.2 + (420000 - 300000) * 0.25 + (s - 420000) * 0.3); } else if (s <= 960000) { print(r, 36000.0 * 0.03 + (144000 - 36000) * 0.1 + (300000 - 144000) * 0.2 + (420000 - 300000) * 0.25 + (660000 - 420000) * 0.3 + (s - 660000) * 0.35); } else { print(r, 36000.0 * 0.03 + (144000 - 36000) * 0.1 + (300000 - 144000) * 0.2 + (420000 - 300000) * 0.25 + (660000 - 420000) * 0.3 + (960000 - 660000) * 0.35 + (s - 960000) * 0.45); } } signed main() { // IOS; int T = 1; // cin >> T; while (T --) solve(); return 0; }
模拟 + 找规律
//#include <bits/stdc++.h> #include <iostream> #include <cstring> #include <cmath> #include <vector> #include <string> #include <map> #include <set> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define VI vector<int> #define PII pair<int, int> #define int long long #define sz() ((int)a.size()) #define LL long long using namespace std; const int N = 1e6 + 10, M = N * 2; int n, m; int a[N]; void solve() { cin >> n; if (n > 10 || n <= 0) { cout << "输入数据有误!"; return; } for (int i = 1; i <= n; i ++) { for (int j = 1; j <= n - i; j ++) cout << ' '; for (int j = 1; j <= 2 * i - 1; j ++) cout << "*"; if (i != n) cout << "\n"; } } signed main() { // IOS; int T = 1; // cin >> T; while (T --) solve(); return 0; }
给的接口函数, 但必须把代码写全才对 (不是很懂
#include <stdio.h> #define N 50 int SearchbyNum(long num[], int score[], int n,long number); int main() { long num[N],number; int score[N],n,i,pos; scanf("%d", &n); for (i=0; i<n; i++) scanf("%ld:%d ", &num[i], &score[i]); scanf("%ld", &number); pos=SearchbyNum(num,score,n,number); if(pos==-1) printf("Not found!\n"); else printf("%d\n",score[pos]); return 0; } int SearchbyNum(long num[], int score[], int n,long number) { for (int i = 0; i < n; i ++) { if (number == num[i]) { return i; } } return -1; }
模拟 模拟 模拟
记录下一次要加上的数的分子和分母, 判断即可
//#include <bits/stdc++.h> #include <iostream> #include <cstring> #include <cmath> #include <vector> #include <string> #include <map> #include <set> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define VI vector<int> #define PII pair<int, int> #define int long long #define sz() ((int)a.size()) #define LL long long #define db double using namespace std; const int N = 1e6 + 10, M = N * 2; db eps; // 精度 int n, m; int a[N]; void solve() { db x; cin >> x >> eps; db m = 1, z = x; db sum = 0; int mulm = 1; db mulz = x * x; db ne = x; while (abs(ne) >= eps) { sum += ne; ne = z * mulz / (m * (mulm + 2) * (mulm + 1)); z = z * mulz; m = m * (mulm + 2) * (mulm + 1); mulm += 2; } sum += ne; printf("%.6f", sum); } signed main() { // IOS; int T = 1; // cin >> T; while (T --) solve(); return 0; }
排序题 (注意相同的数要按编号输出)
#include <bits/stdc++.h> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define VI vector<int> #define PII pair<int, int> #define int long long #define sz() ((int)a.size()) #define LL long long using namespace std; const int N = 1e6 + 10, M = N * 2; struct Node { string na; int sol; int pos; bool operator> (const Node W) const { // 重载大于号 if (sol != W.sol) return sol > W.sol; return pos < W.pos; } }peo[110]; int n, m; int a[N]; void solve() { cin >> n; for (int i = 0; i < n; i ++) { string na; int sol; cin >> na >> sol; peo[i] = {na, sol, i}; } sort(peo, peo + n, greater<Node>()); // 也可以直接写个cmp函数 for (int i = 0; i < n; i ++) { auto [na, sol, p] = peo[i]; cout << i + 1 << " " << na << ' ' << sol << "\n"; } } signed main() { IOS; int T = 1; cin >> T; while (T --) solve(); return 0; }
环形区间dp
解决环的通用方式, 破环成链: 将前n个数赋值给后n个数就行
#include <bits/stdc++.h> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define mem(a, b) memset(a, b, sizeof a) #define VI vector<int> #define PII pair<int, int> #define int long long #define sz() ((int)a.size()) #define LL long long using namespace std; const int N = 2000 + 10, M = N * 2; int n, m; int a[N]; int s[N]; int f[N][N]; void solve() { cin >> n; for (int i = 1; i <= n; i ++) cin >> a[i], a[i + n] = a[i]; for (int i = 1; i <= 2 * n; i ++) s[i] = s[i - 1] + a[i]; mem(f, 0x3f); for (int len = 1; len <= n; len ++) { for (int l = 1; l + len - 1 <= 2 * n; l ++) { int r = l + len - 1; if (len == 1) f[l][l] = 0; for (int k = l; k < r; k ++) { f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r] + s[r] - s[l - 1]); } } } int res = f[1][n]; for (int i = 2; i <= n; i ++) res = min(res, f[i][i + n - 1]); cout << res << "\n"; mem(f, -0x3f); for (int len = 1; len <= n; len ++) { for (int l = 1; l + len - 1 <= 2 * n; l ++) { int r = l + len - 1; if (len == 1) f[l][l] = 0; for (int k = l; k < r; k ++) { f[l][r] = max(f[l][r], f[l][k] + f[k + 1][r] + s[r] - s[l - 1]); } } } res = f[1][n]; for (int i = 2; i <= n; i ++) res = max(res, f[i][i + n - 1]); cout << res; } signed main() { IOS; int T = 1; // cin >> T; while (T --) solve(); return 0; }
#include <bits/stdc++.h> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define mem(a, b) memset(a, b, sizeof a) #define VI vector<int> #define PII pair<int, int> #define int long long #define sz() ((int)a.size()) #define LL long long using namespace std; const int N = 1000000 + 10, M = N * 2; int n, m; int a[N]; void solve() { cin >> n >> m; int res = 100000001; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1, j = i, s = 0; i <= n; i ++) { while (j <= n + 1 && s < m) s += a[j], j ++; if (j <= n + 1) res = min(res, j - i); else break; s -= a[i]; } if (res == 100000001) cout << "0\n"; else cout << res << "\n"; } signed main() { IOS; int T = 1; cin >> T; while (T --) solve(); return 0; }
贪心
以结束时间从小到大排序, 依次选取一定是最优解 (在这不给予证明
#include <bits/stdc++.h> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define mem(a, b) memset(a, b, sizeof a) #define VI vector<int> #define PII pair<int, int> #define int long long #define sz(a) ((int)a.size()) #define LL long long using namespace std; const int N = 1000000 + 10, M = N * 2; int n, m; int a[N]; vector<PII> act; void solve() { while (cin >> n, n) { act.clear(); for (int i = 1; i <= n; i ++) { int b, e; cin >> b >> e; act.push_back({e, b}); } sort(act.begin(), act.end()); int res = 1; int las = act[0].first; for (int i = 1; i < sz(act); i ++) { if (act[i].second >= las) { las = act[i].first; res ++; } } cout << res; } } signed main() { IOS; int T = 1; //cin >> T; while (T --) solve(); return 0; }
最短路 (刚开始没看见还有边权不为1的边, 就写的bfs, 后来发现不想写其他的了,微微改了一下
:(这个写的并不好, 仅供参考
#include <bits/stdc++.h> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define mem(a, b) memset(a, b, sizeof a) #define VI vector<int> #define PII pair<int, int> #define int long long #define sz(a) ((int)a.size()) #define LL long long using namespace std; const int N = 100 + 10, M = N * 2; int n, m; int dist[N][N]; char g[N][N]; int dx[] = {0, 1, 0, -1}; int dy[] = {1, 0, -1, 0}; int bex, bey; int enx, eny; void bfs() { mem(dist, 0x3f); queue<PII> q; q.push({bex, bey}); dist[bex][bey] = 0; while (q.size()) { auto [x, y] = q.front(); q.pop(); for (int i = 0; i < 4; i ++) { int a = x + dx[i], b = y + dy[i]; if (a < 1 || a > n || b < 1 || b > m) continue; if (g[a][b] == '#') continue; if (isdigit(g[a][b])) { if (dist[a][b] <= dist[x][y] + g[a][b] - '0') continue; dist[a][b] = dist[x][y] + g[a][b] - '0' + 1; q.push({a, b}); } else { if (dist[a][b] <= dist[x][y] + 1) continue; dist[a][b] = dist[x][y] + 1; q.push({a, b}); } } } } void solve() { while (cin >> n >> m) { for (int i = 1; i <= n; i ++) cin >> g[i] + 1; bool has = false; for (int i = 1; i <= n; i ++) { if (has) break; for (int j = 1; j <= m; j ++) if (g[i][j] == 'S') { bex = i, bey = j; } else if (g[i][j] == 'T') { enx = i, eny = j; } } bfs(); if (dist[enx][eny] == dist[0][0]) cout << "impossible\n"; else cout << dist[enx][eny] << "\n"; } } signed main() { IOS; int T = 1; //cin >> T; while (T --) solve(); return 0; }
并查集典题
开个数组维护连通块的大小就行
#include <bits/stdc++.h> #define de(a) cout << #a << " = " << a << "\n"; #define deg(a) cout << #a << " = " << a << " "; #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define mem(a, b) memset(a, b, sizeof a) #define VI vector<int> #define PII pair<int, int> #define int long long //#define sz(a) ((int)a.size()) #define LL long long using namespace std; const int N = 1000 + 10, M = N * 2; int n, m; int p[N]; int sz[N]; int find(int x) { if (p[x] != x) p[x] = find(p[x]); return p[x]; } void solve() { cin >> n >> m; iota(p, p + n + 1, 0); for (int i = 1; i <= n; i ++) sz[i] = 1; while (m --) { int a, b; cin >> a >> b; if (find(a) != find(b)) { sz[find(b)] += sz[find(a)]; p[find(a)] = p[find(b)]; } } int cnt = 0, maxx = 0; for (int i = 1; i <= n; i ++) if (p[i] == i) { cnt ++; maxx = max(maxx, sz[i]); } cout << cnt << " " << maxx << "\n"; } signed main() { IOS; int T = 1; cin >> T; while (T --) solve(); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。