7-1 快速排序
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
int main(){
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> a[i];
sort(a, a + n);
for(int i = 0; i < n; i ++ ) {
if(i == 0) cout << a[i];
else cout << " " << a[i];
}
return 0;
}
7-2 棋盘覆盖问题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1050;
int tile = 1;
int dr, dc, len;
int g[N][N];
void chessBorad(int tr, int tc, int dr, int dc, int len) {
if(len == 1) return;
int t = tile ++;
int s = len / 2;
if(dr < tr + s && dc < tc + s) chessBorad(tr, tc, dr, dc, s);
else {
g[tr + s - 1][tc + s - 1] = t;
chessBorad(tr, tc, tr + s - 1, tc + s - 1, s);
}
if(dr < tr + s && dc >= tc + s) chessBorad(tr, tc + s, dr, dc, s);
else {
g[tr + s - 1][tc + s] = t;
chessBorad(tr, tc + s, tr + s - 1, tc + s, s);
}
if(dr >= tr + s && dc < tc + s) chessBorad(tr + s, tc, dr, dc, s);
else {
g[tr + s][tc + s - 1] = t;
chessBorad(tr + s, tc, tr + s, tc + s - 1, s);
}
if(dr >= tr + s && dc >= tc + s) chessBorad(tr + s, tc + s, dr, dc, s);
else {
g[tr + s][tc + s] = t;
chessBorad(tr + s, tc + s, tr + s, tc + s, s);
}
}
int main(){
cin >> len >> dr >> dc;
chessBorad(0, 0, dr, dc, len);
for(int i = 0; i < len; i ++ ) {
for(int j = 0; j < len; j ++ ) {
printf("%-5d", g[i][j]);
}
cout << endl;
}
return 0;
}
7-3 活动选择问题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
struct T {
int l, r;
}t[N];
int n, cnt, now;
bool cmp(struct T a, struct T b) {
return a.r < b.r;
}
int main(){
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> t[i].l >> t[i].r;
sort(t, t + n, cmp);
for(int i = 0; i < n; i ++ ) {
if(t[i].l >= now) {
cnt ++;
now = t[i].r;
}
}
cout << cnt;
return 0;
}
7-4 最小生成树-kruskal
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e7 + 10;
struct e {
int a, b, c;
}e[N];
int n, m, cnt;
int ans;
int p[N];
int find(int x) {
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
bool cmp(struct e a, struct e b) {
return a.c < b.c;
}
int main() {
cin >> n >> m;
for(int i = 0; i < m; i ++ ) scanf("%d %d %d", &e[i].a, &e[i].b, &e[i].c);
sort(e, e + m, cmp);
for(int i = 0; i < n; i ++ ) p[i] = i;
for(int i = 0; i < m; i ++ ) {
int pa = find(e[i].a);
int pb = find(e[i].b);
if(pa != pb) {
p[pa] = pb;
ans += e[i].c;
cnt ++;
}
if(cnt == n - 1) break;
}
cout << ans;
return 0;
}
7-5 最长公共子序列长度
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
char a[N], b[N];
int f[N][N];
int main(){
scanf("%s %s", a + 1, b + 1);
n = strlen(a + 1);
m = strlen(b + 1);
for(int i = 1; i <= n; i ++ ) {
for(int j = 1; j <= m; j ++ ) {
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
if(a[i] == b[j]) f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1);
}
}
cout << f[n][m];
return 0;
}
7-6 最短路径之Floyd
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
const int INF = 0x3f3f3f3f;
int n, m;
int d[N][N];
string p[N][N];
void floyd() {
for(int k = 0; k < n; k ++ ) {
for(int i = 0; i < n; i ++ ) {
for(int j = 0; j < n; j ++ ) {
if(d[i][k] + d[k][j] < d[i][j]) {
d[i][j] = d[i][k] + d[k][j];
p[i][j] = p[i][k] + p[k][j];
}
}
}
}
}
void print(int a, int b) {
if(d[a][b] > INF / 2) printf("%d->%d:-1\n", a, b);
else {
string s = p[a][b];
string str = "";
str += s[0];
for(int i = 1; i < s.size(); i ++ ) {
if(s[i] != s[i - 1]) str += s[i];
}
cout << str << ":" << d[a][b] << endl;
}
}
int main(){
cin >> n >> m;
for(int i = 0; i < n; i ++ ) {
for(int j = 0; j < n; j ++ ) {
if(i == j){
d[i][j] = 0;
p[i][j] = to_string(i) + "->" + to_string(j);
}
else d[i][j] = INF;
}
}
for(int i = 0; i < m; i ++ ) {
int a, b, c;
cin >> a >> b >> c;
d[a][b] = c;
p[a][b] = to_string(a) + "->" + to_string(b);
}
floyd();
for(int i = 0; i < 2; i ++ ) {
int a, b;
cin >> a >> b;
print(a, b);
}
int maxi = -1, maxj = -1, maxx = -INF;
for(int i = 0; i < n; i ++ ) {
for(int j = 0; j < n; j ++ ) {
if(d[i][j] > maxx && d[i][j] < INF / 2) {
maxi = i;
maxj = j;
maxx = d[i][j];
}
}
}
print(maxi, maxj);
return 0;
}
7-7 图着色问题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 510;
int n, m, k;
int p, sum;
int color[N];
int cnt[N];
struct E {
int l, r;
}e[N * N];
int main(){
cin >> n >> m >> k;
for(int i = 0; i < m; i ++ ) cin >> e[i].l >> e[i].r;
cin >> p;
while(p -- ) {
memset(cnt, 0, sizeof cnt);
bool flag = true;
sum = 0;
for(int i = 1; i <= n; i ++ ) {
cin >> color[i];
if(cnt[color[i]] == 0) {
cnt[color[i]] ++;
sum ++;
}
}
if(sum != k) flag = false;
for(int i = 0; i < m; i ++ ) {
if(color[e[i].l] == color[e[i].r]) {
flag = false;
break;
}
}
if(flag) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
7-8 0/1背包问题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, M;
int p[N];
int w[N], v[N];
int f[N][N];
int main(){
cin >> n >> M;
for(int i = 1; i <= n; i ++ ) cin >> w[i] >> v[i];
for(int i = 1; i <= n; i ++ ) {
for(int j = 1; j <= M; j ++ ) {
f[i][j] = f[i - 1][j];
if(j >= w[i]) f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i]);
}
}
int k = 0;
for(int i = n, j = M; f[i][j] > 0 && i > 0; i -- ) {
if(f[i][j] != f[i - 1][j]) {
p[k ++] = i;
j -= w[i];
}
}
if(f[n][M] == 0) {
cout << "No" << endl << "0";
} else {
for(int i = k - 1; i >= 0; i -- ) cout << p[i] << " " ;
cout << endl << f[n][M];
}
return 0;
}