算法设计_综合练习_编程题(下)

简介: 算法设计_综合练习_编程题

7-35 h0154.加勒比海盗船——最优装载问题


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1000005;
int t;
int main() {
    cin >> t;
    while (t --) {
        double c;
        vector<double> a;
        int m, cnt = 0;
        cin >> c >> m;
        for (int i = 0; i < m; i ++) {
            double x;
            cin >> x;
            a.push_back(x);
        }
        sort(a.begin(), a.end());
        double ans = 0;
        for (int i = 0; i < m; i ++) {
            ans += a[i];
            if (ans <= c) cnt ++;
            else break;
        }
        cout << cnt << endl;
    }
    return 0;
}


7-36 会场安排问题


#include <iostream>
#include <algorithm>
using namespace std;
struct activity {
    int b, e;
//     bool operator < (activity & t) {
//         if (e != t.e) return e < t.e;
//     }
}a[10010];
int n;
int st[10010];
bool cmp (activity x, activity y) {
    return x.b < y.b;
//     if (x.e != y.e) return x.e < y.e;
//     else return x.b < y.b;
}
int main() {
   cin >> n;
    int cnt = 0;
    for (int i = 0; i < n; i ++) {
        cin >> a[i].b >> a[i].e;
//         cout << a[i].b << ' ' << a[i].e << endl;
    }
    sort(a, a + n, cmp);
    for (int i = 0; i < n; i ++)
//         cout << a[i].b << ' ' << a[i].e << endl;
        if (!st[a[i].e]) {
            cnt ++;
            st[a[i].e] = 1;
            int pre = a[i].e;
            for (int j = i + 1; j < n; j ++)
                if (!st[a[j].e] && a[j].b >= pre) {
                    pre = a[j].e;
                    st[a[j].e] = 1;
                }
        }
    cout << cnt << endl;
    return 0;
}


7-37 h0145. 会议安排


#include <iostream>
#include <algorithm>
using namespace std;
struct activity {
    int b, e, no;
    bool operator < (activity & t) {
        if (e != t.e) return e < t.e;
        else return b < t.b;
    }
}a[10010];
int n, x ,y;
// bool cmp (activity x, activity y) {
//     if (x.b != x.b) return x.b < y.b;
//     else return x.e < y.e;
// }
int main() {
    int t;
    cin >> t;
    while (t --) {
        cin >> n;
        int cnt = 0, pre = 0;
        for (int i = 0; i < n; i ++) {
            cin >> a[i].b >> a[i].e;
    //         cout << a[i].b << ' ' << a[i].e << endl;
        }
        sort(a, a + n);
        for (int i = 0; i < n; i ++) {
//             cout << a[i].b << ' ' << a[i].e << endl;
            if (a[i].b >= pre) {
                pre = a[i].e;
//                 cout << a[i].b << ' ' << a[i].e << endl;
                cnt ++;
            }
        }
        cout << cnt << endl;
    }
    return 0;
}


7-38 最少失约


#include <iostream>
#include <algorithm>
using namespace std;
struct activity {
    int b, e, no;
    bool operator < (activity & t) {
        if (e != t.e) return e < t.e;
        else return b < t.b;
    }
}a[10010];
int n, x ,y;
// bool cmp (activity x, activity y) {
//     if (x.b != x.b) return x.b < y.b;
//     else return x.e < y.e;
// }
int main() {
    int t;
    cin >> t;
    while (t --) {
        cin >> n;
        int cnt = 0, pre = 0;
        for (int i = 0; i < n; i ++) {
            cin >> a[i].b >> a[i].e;
    //         cout << a[i].b << ' ' << a[i].e << endl;
        }
        sort(a, a + n);
        for (int i = 0; i < n; i ++) {
//             cout << a[i].b << ' ' << a[i].e << endl;
            if (a[i].b >= pre) {
                pre = a[i].e;
//                 cout << a[i].b << ' ' << a[i].e << endl;
                cnt ++;
            }
        }
        cout << n - cnt << endl;
    }
    return 0;
}


7-39 活动选择问题


#include <iostream>
#include <algorithm>
using namespace std;
struct activity {
    int b, e, no;
    bool operator < (activity & t) {
        if (e != t.e) return e < t.e;
        else return b < t.b;
    }
}a[10010];
int n;
// bool cmp (activity x, activity y) {
//     if (x.b != x.b) return x.b < y.b;
//     else return x.e < y.e;
// }
int main() {
    while (cin >> n) {
        int cnt = 0, pre = 0;
        for (int i = 0; i < n; i ++) {
            cin >> a[i].b >> a[i].e;
    //         cout << a[i].b << ' ' << a[i].e << endl;
        }
        sort(a, a + n);
        for (int i = 0; i < n; i ++) {
//             cout << a[i].b << ' ' << a[i].e << endl;
            if (a[i].b >= pre) {
                pre = a[i].e;
//                 cout << a[i].b << ' ' << a[i].e << endl;
                cnt ++;
            }
        }
        cout << cnt << endl;
    }
    return 0;
}


7-40 删数问题


// 贪心
#include <iostream>
using namespace std;
int k;
string str;
int main() {
    cin >> str >> k;
    for (int i = 0; i < k; i ++)
        for (int j = 0; j < str.size(); j ++)
            if (str[j] > str[j + 1]) {
                str.erase(str.begin() + j);
                break;
            }
    cout << str << endl;
    return 0;
}

7-41 最短路径条数

#include <iostream>
using namespace std;
const int N = 1010;
int g[N][N];
int main() {
    int n, m, x1, y1, x2, y2;
    cin >> n >> m >> x1 >> y1 >> x2 >> y2;
    if (x1 >= x2) swap(x1, x2);
    if (y1 >= y2) swap(y1, y2);
    for (int i = x1; i <= n; i ++) {
        for (int j = y1; j <= m; j ++) {
            if (x1 == i || y1 == i)
                g[i][j] = 1;
            else
                g[i][j] = g[i - 1][j] + g[i][j - 1];
        }
    }
    cout << g[x2][y2] << endl;
    return 0;
}


7-42 一步两步


#include <iostream>
using namespace std;
const int N = 1010;
int f[N], n;
int main() {
    cin >> n;
    f[0] = 1;
    f[1] = 2;
    for (int i = 2; i < n; i ++)
        f[i] = f[i - 1] + f[i - 2];
    cout << f[n - 1];
    return 0;
}


7-43 青蛙跳台阶


#include <iostream>
using namespace std;
const int N = 1010;
int f[N], n;
int main() {
    cin >> n;
    f[0] = 1;
    f[1] = 2;
    for (int i = 2; i < 60; i ++)
        f[i] = f[i - 1] + f[i - 2];
    while (n --) {
        int x;
        cin >> x;
        cout << f[x - 1] << endl;
    }
    return 0;
}


7-45 让人头疼的“双十一”


#include <iostream>
#include <cstring>
using namespace std;
const int N = 3010;
int m ,n;
int v[N], w[N];
int f[N];
int main() {
    int t;
    cin >> t;
    for (int k = 1; k <= t; k ++) {
        cin >> m >> n;
        for (int i = 1; i <= n; i ++)
            cin >> v[i];
        for (int i = 1; i <= n; i ++)
            cin >> w[i];
        for (int i = 1; i <= n; i ++)
            for (int j = m; j >= v[i]; j --)
                f[j] = max(f[j], f[j - v[i]] + w[i]);
        printf("Case #%d: %d\n", k, f[m]);
        memset(f, 0, sizeof f);
    }
    return 0;
}


7-46 h0173. 01背包问题


#include <iostream>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N];
int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i ++)
        cin >> v[i + 1] >> w[i + 1];
    for (int i = 1; i <= n; i ++)
        for (int j = m; j >= v[i]; j --)
            f[j] = max(f[j], f[j - v[i]] + w[i]);
    cout << f[m] << endl;
    return 0;
}


7-47 最长公共子序列长度


#include <iostream>
using namespace std;
const int N = 1010;
string str1, str2;
int f[N][N];
int main() {
    cin >> str1 >> str2;
    for (int i = 1; i <= str1.size(); i ++) {
        for (int j = 1; j <= str2.size(); j ++) {
            if (str1[i - 1] == str2[j - 1])
                f[i][j] = f[i - 1][j - 1] + 1;
            else
                f[i][j] = max(f[i - 1][j], f[i][j - 1]);
        }
    }
    cout << f[str1.size()][str2.size()] << endl;
    return 0;
}


7-48 h0215.闭区间问题


#include <iostream>
#include <algorithm>
using namespace std;
struct activity {
    int b, e, no;
//     bool operator < (activity & t) {
//         if (e != t.e) return e < t.e;
//     }
}a[1010];
int n, x ,y;
bool cmp (activity x, activity y) {
    return x.e < y.e;
//     if (x.e != y.e) return x.e < y.e;
//     else return x.b < y.b;
}
int main() {
   cin >> n;
    int cnt = 0, pre = 0;
    for (int i = 0; i < n; i ++) {
        cin >> a[i].b >> a[i].e;
        if (a[i].b > a[i].e) {
            int t = a[i].e;
            a[i].e = a[i].b;
            a[i].b = t;
        }
    }
    sort(a, a + n, cmp);
    for (int i = 0; i < n; i ++) {
//         cout << a[i].b << ' ' << a[i].e << endl;
        if (a[i].b > pre) {
            pre = a[i].e;
//             cout << a[i].b << ' ' << a[i].e << endl;
            cnt ++;
        }
    }
    cout << n - cnt;
    return 0;
}


7-49 h0206. 区间选点


#include <iostream>
#include <algorithm>
using namespace std;
struct activity {
    int b, e, no;
//     bool operator < (activity & t) {
//         if (e != t.e) return e < t.e;
//     }
}a[1010];
int n, x ,y;
bool cmp (activity x, activity y) {
    return x.e < y.e;
//     if (x.e != y.e) return x.e < y.e;
//     else return x.b < y.b;
}
int main() {
   cin >> n;
    int cnt = 0, pre = -0x3f3f3f3f;
    for (int i = 0; i < n; i ++) {
        cin >> a[i].b >> a[i].e;
//         if (a[i].b > a[i].e) {
//             int t = a[i].e;
//             a[i].e = a[i].b;
//             a[i].b = t;
//         }
    }
    sort(a, a + n, cmp);
    for (int i = 0; i < n; i ++) {
//         cout << a[i].b << ' ' << a[i].e << endl;
        if (a[i].b > pre) {
            pre = a[i].e;
//             cout << a[i].b << ' ' << a[i].e << endl;
            cnt ++;
        }
    }
    cout << cnt;
    return 0;
}
Sdadaf
#include <iostream>
#include <map>
#include <queue>
using namespace std;
const int MAX = 1010;
int n;
struct HTreeNode {
    char data;
    int weight;
    int parent;
    int lchild;
    int rchild;
};
HTreeNode ht[MAX];
map<char, string> mp;
struct NodeType {
    int no;
    char data;
    int weight;
    bool operator < (const NodeType &s) {
        return s.weight < weight;
    }
};
void init() {
    int i;
    map<char, int> mp;
    for (int i = 0; i < n; i ++)
        mp[str[i]] ++;
    n = mp.size();
    i = 0;
    for (auto it : mp) {
        ht[i].data = it.first;
        ht[i].weight = it.second;
        i ++;
    }
    for (int j = 0; j < 2 * n - 1; j ++) {
        ht[j].lchild = ht[j].rchild = ht[j].parent = -1;
    }
}
void createHTree() {
    NodeType e, e1, e2;
    priority_qeue<NodeType> qu;
    for (int i = 0; i < n; i ++) {
        e.no = i;
        e.data = ht[i].data;
        e.weight = ht[i].weight;
        qu.push(e);
    }
    for (int j = n; j < 2 * n - 1; j ++) {
        e1 = qu.top(); qu.pop();
        e2 = qu.top(); qu.pop();
        ht[j].weight = e1.weight + e2.weight;
        ht[j].lchild = e1.no;
        ht[j].rchild = e2.no;
        ht[e2.no].parent = j;
        ht[e2.no].parent = j;
        e.no = j;
        e.weight = e1.weight + e2.weight;
        qu.push(e);
    }
}
void CreateHCode() {
    string code;
    code reserve(MAX);
}
int main() {
    cin >> n;
    return 0;
}


目录
相关文章
|
7月前
|
算法 数据安全/隐私保护
火山中文编程 -- MD5算法和SHA算法
火山中文编程 -- MD5算法和SHA算法
59 0
火山中文编程 -- MD5算法和SHA算法
|
28天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
40 2
|
2月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
37 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
2月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
27 0
|
7月前
|
存储 分布式计算 算法
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
99 0
|
4月前
|
存储 算法 搜索推荐
编程之旅中的算法启示
【8月更文挑战第31天】在编程世界的迷宫里,算法是那把钥匙,它不仅能解锁问题的答案,还能引领我们深入理解计算机科学的灵魂。本文将通过一次个人的技术感悟旅程,探索算法的奥秘,分享如何通过实践和思考来提升编程技能,以及这一过程如何启示我们更深层次地认识技术与生活的交织。
|
5月前
|
存储 算法 搜索推荐
告别低效编程!Python算法设计与分析中,时间复杂度与空间复杂度的智慧抉择!
【7月更文挑战第22天】在编程中,时间复杂度和空间复杂度是评估算法效率的关键。时间复杂度衡量执行时间随数据量增加的趋势,空间复杂度关注算法所需的内存。在实际应用中,开发者需权衡两者,根据场景选择合适算法,如快速排序(平均O(n log n),最坏O(n^2),空间复杂度O(log n)至O(n))适合大规模数据,而归并排序(稳定O(n log n),空间复杂度O(n))在内存受限或稳定性要求高时更有利。通过优化,如改进基准选择或减少复制,可平衡这两者。理解并智慧地选择算法是提升代码效率的关键。
71 1
|
4月前
|
存储 算法
【C算法】编程初学者入门训练140道(1~20)
【C算法】编程初学者入门训练140道(1~20)
|
5月前
|
存储 算法 Python
震撼!Python算法设计与分析,分治法、贪心、动态规划...这些经典算法如何改变你的编程世界!
【7月更文挑战第9天】在Python的算法天地,分治、贪心、动态规划三巨头揭示了解题的智慧。分治如归并排序,将大问题拆解为小部分解决;贪心算法以局部最优求全局,如Prim的最小生成树;动态规划通过存储子问题解避免重复计算,如斐波那契数列。掌握这些,将重塑你的编程思维,点亮技术之路。
78 1
|
6月前
|
机器学习/深度学习 算法 搜索推荐
编程之舞:探索算法的优雅与力量
【6月更文挑战第10天】在软件的世界里,算法是构筑数字宇宙的基石。它们如同精心编排的舞蹈,每一个步骤都充满着逻辑的美感和解决问题的力量。本文将带领读者走进算法的世界,一起感受那些精妙绝伦的编程思想如何转化为解决现实问题的钥匙。
37 3