PTA算法测试题(编程)

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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值