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

目录

7-1 气球升起来... 1

7-2 集合A-B.. 2

7-3 排队... 3

7-4 办事大厅排队... 3

7-5 天梯赛的善良... 4

7-6 词典... 5

7-7 查找出现过的数字... 5

7-8 出现次数最多的数字和次数... 6

7-9 英雄出场王... 6

7-10 求n个数中差的绝对值相差最小的2个数的差值... 7

7-11 数列求和-加强版... 7

7-12 数组循环右移(加强版)... 8

7-13 猴子选大王[加强版] 8

7-14 最大公约数... 9

7-15 大菲波数... 9

7-16 大数的乘法... 10

7-17 大数和... 11

7-18 求最大公约数... 13

7-19 二分查找... 13

7-20 全排列(分治)... 14

7-21 我是送分题... 15

7-22 二分查找... 16

7-23 程序设计综合实践 2.1. 17

7-24 找第k小的数... 17

7-25 第 k 大的整数**. 17

7-26 0/1背包问题... 18

7-27 子集和问题... 19

7-28 幂集(回溯法)... 20

7-32 CPA招新Ⅰ... 22

7-33 多参加活动,生活才精彩... 22

7-34 装箱问题... 23

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

7-36 会场安排问题... 24

7-37 h0145. 会议安排... 25

7-38 最少失约... 26

7-39 活动选择问题... 27

7-40 删数问题... 28

7-41 最短路径条数... 28

7-42 一步两步... 29

7-43 青蛙跳台阶... 29

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

7-46 h0173. 01背包问题... 30

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

7-48 h0215.闭区间问题... 31

7-49 h0206. 区间选点... 32

7-1 气球升起来

#include

#include

#include

using namespace std;

const int N = 1010;

int n;

string str;

map mp;

int main() {

    while (cin >> n) {

        for (int i = 0; i < n; i ++) {

            cin >> str;

            mp[str] ++;

        }

        string res;

        int cnt = 0;

        for (auto item : mp) {

            if (cnt < item.second) {

                res = item.first;

                cnt = item.second;

            }

        }

        cout << res << endl;

        mp.clear();

    }

    return 0;

}

7-2 集合A-B

#include

#include

#include

using namespace std;

int t, n, m;

set arr1, arr2;

int x, i;

int main() {

    cin >> t;

    while (t --) {

        cin >> n >> m;

        int f = 0;

        for (i = 0; i < n; i ++)

            cin >> x, arr1.insert(x);

        for (i = 0; i < m; i ++)

            cin >> x, arr2.insert(x);

        set res;

        for (auto it : arr1) {

            if (arr2.find(it) != arr2.end()) {

               

            } else {

                res.insert(it);

                if (f) cout << ' ';

                cout << it, f = 1;

            }

        }

        if (!f) cout << "NULL";

        cout << endl;

        arr1.clear();

        arr2.clear();

    }

    return 0;

}

7-3 排队

#include

#include

using namespace std;

const int N = 1010;

int n, arr[N];

int x;

int main() {

    cin >> n;

    for (int i = 0; i < n; i ++) {

        cin >> arr[i];

    }

    cin >> x;

    sort(arr, arr + n);

    int l = 0, r = 0, f = 0;

    for (int i = 0; i < n; i ++) {

        if (arr[i] == x && f == 0) l = i + 1, f = 1;

        if (arr[i] == x) r = i + 1;

    }

    cout << l << ' ' << r << endl;

    return 0;

}

7-4 办事大厅排队

#include

using namespace std;

const int N = 100010;

string str, q[N];

int n, h, t = -1;

int main() {

    int n;

    cin >> n;

    while (n --) {

        cin >> str;

        if (str == "in") {

            cin >> str;

            q[ ++ t] = str;

        } else if (str == "out"){

            h ++;

        } else {

            if (h > t) cout << "NULL" << endl;

            else cout << q[h] << endl;

        }

    }

    return 0;

}

7-5 天梯赛的善良

#include

using namespace std;

const int N = 20010;

int n, max_num, min_num, x;

int a = -0x3f3f3f3f, b = 0x3f3f3f3f;

int main() {

    cin >> n;

    for (int i = 0; i < n; i ++) {

        cin >> x;

        if (x > a) a = x, max_num = 1;

        else if (x == a)max_num ++;

        if (x < b) b = x, min_num  = 1;

        else if (x == b) min_num ++;

    }

    cout << b << ' ' << min_num << endl;

    cout << a << ' ' << max_num << endl;

    return 0;

}

7-6 词典

#include

#include

using namespace std;

const int N = 1010;

int n, m;

string str1, str2;

mapmp;

int main() {

    cin >> n >> m;

    for (int i = 0; i < n; i ++) {

        cin >> str1 >> str2;

        mp[str2] = str1;

    }

    for (int i = 0 ; i < m; i ++) {

        cin >> str1;

        if (mp.count(str1))

            cout << mp[str1] << endl;

        else cout << "eh" << endl;

    }

    return 0;

}

7-7 查找出现过的数字

#include

#include

using namespace std;

int n, m, x;

set s;

int main() {

    cin >> m >> n;

    while (m --) {

        cin >> x;

        s.insert(x);

    }

    while (n --) {

        cin >> x;

        if (s.find(x) != s.end()) cout << "YES" << endl;

        else cout << "NO" << endl;

    }

    return 0;

}

7-8 出现次数最多的数字和次数

#include

#include

using namespace std;

mapmp;

int n, x;

int x_v, x_c;

int main() {

    cin >> n;

    for (int i = 0; i < n; i ++) {

        cin >> x;

        mp[x] ++;

    }

    for (auto i : mp) {

        if (i.second > x_c) {

            x_v = i.first;

            x_c = i.second;

        }

    }

    cout << x_v << ' ' << x_c << endl;

    return 0;

}

7-9 英雄出场王

#include

#include

using namespace std;

const int N = 100000000;

int n, x;

int x_v, x_c = -1;

map mp;

int main() {

    cin >> n;

    for (int i = 0; i < n; i ++) {

        cin >> x;

        mp[x] ++;

    }

    for (auto i : mp) {

        if (i.second > x_c) {

            x_v = i.first;

            x_c = i.second;

        }

    }

    cout << x_v << endl << x_c << endl;

    return 0;

}

7-10 求n个数中差的绝对值相差最小的2个数的差值

#include

using namespace std;

const int N = 1010;

int n, x_v = 100000000;

int arr[N];

int main() {

    cin >> n;

    for (int i = 0; i < n; i ++) {

        cin >> arr[i];

    }

    for (int i = 0; i < n; i ++) {

        for (int j = i + 1; j < n; j ++) {

            if (abs(arr[i] - arr[j]) < x_v) {

                x_v  = abs(arr[i] - arr[j]);

            }

        }

    }

    cout << x_v << endl;

    return 0;

}

7-11 数列求和-加强版

#include

using namespace std;

int main() {

    int a, n;

    cin >> a >> n;

    int arr[1000010], cnt = 0, t = 0;

    if (!n) {

        cout << 0;

        return 0;

    }

    for (int i = 0; i < n; i ++) {

        arr[cnt ++] = (a * (n - i) + t )% 10;

        t = (a * (n - i) + t)/ 10;

    }

    if (t) arr[cnt ++] = t;

    for (int i = cnt - 1; i >= 0; i --) {

        cout << arr[i];

    }

    return 0;

}

7-12 数组循环右移(加强版)

#include

using namespace std;

int main() {

    int n, m, i, f = 0;

    cin >> n >> m;

    m %= n;

    int a[n];

    for (i = 0; i < n; i ++)

        cin >> a[i];

    for (i = n - m; i < n; i ++) {

        if (f ++) cout << ' ';

        cout << a[i];

    }

    for (i = 0; i < n - m; i ++) {

        if (f ++) cout << ' ';

        cout << a[i];

    }

    cout << endl;

    return 0;

}

7-13 猴子选大王[加强版]

#include

using namespace std;

int main() {

    int n, k, s = 1;

    cin >> n >> k;

    for (int i = 1; i <= n; i ++ )

        s = (s + k) % i;

    cout << s;

    return 0;

}

7-14 最大公约数

#include

#include

using namespace std;

int main() {

    int a, b, res = 0;

    cin >> a >> b;

    for (int i = 2; i < max(a, b); i ++) {

        if (a % i == 0 && b % i == 0) {

            res = i;

        }

    }

    res = __gcd(a, b);

    cout << res << endl;

    return 0;

}

7-15 大菲波数

#include

#include

#include

using namespace std;

const int N = 1010;

string f[N];

int t;

vector add(vector &A, vector &B) {

    vector C;

    for (int i = 0, t = 0; i < A.size() || i < B.size() || t; i++) {

        if (i < A.size()) t += A[i];

        if (i < B.size()) t += B[i];

        C.push_back(t % 10);

        t /= 10;

    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;

}

int main() {

    f[1] = f[2] = "1";

    for (int i = 3; i < N; i ++) {

        string s1 = f[i - 1];

        string s2 = f[i - 2];

       

        vector A, B;

        for (int i = s1.size() - 1; i >= 0; i --)

            A.push_back((s1[i] - '0'));

        for (int i = s2.size() - 1; i >= 0; i --)

            B.push_back((s2[i] - '0'));

       

        auto C = add(A, B);

       

        string s;

        for (int i = C.size() - 1; i >= 0; i --)

            s += to_string(C[i]);

        f[i] = s;

    }

   

    cin >> t;

    while (t --) {

        int x;

        cin >> x;

        cout << f[x] << endl;

    }

    return 0;

}

7-16 大数的乘法

#include

#include

using namespace std;

typedef long long LL;

vector mul(vector &A, int b) {

    vector C;

    for (LL i = 0, t = 0; i

        if (i < A.size()) t += A[i] * b;

        C.push_back(t % 10);

        t /= 10;

    }

    while (C.size() > 1 && C.back() == 0)

        C.pop_back();

    return C;

}

int main() {

    string s;

    int b;

    while(cin >> s >> b) {

        vector A;

        for (int i = s.size() - 1; i >= 0; i --)

            A.push_back(s[i] - '0');

        auto C = mul(A, b);

        for (int i = C.size() - 1; i >= 0; i --)

            cout << C[i];

        cout << endl;

    }

    return 0;

}

7-17 大数和

#include

#include

using namespace std;

vector add(vector &A, vector &B) {

    vector C;

    for (int i = 0, t = 0; i < A.size() || i < B.size() || t; i ++) {

        if (i < A.size()) t += A[i];

        if (i < B.size()) t += B[i];

        C.push_back(t % 10);

        t /= 10;

    }

   

    while (C.back() == 0 && C.size() > 1)

        C.pop_back();

    return C;

}

vector sub(vector &A, vector &B) {

    vector C;

    for (int i = 0, t = 0; i < A.size(); i ++) {

        t = A[i] - t;

        if (i < B.size()) t -= B[i];

        C.push_back((t + 10) % 10);

        if (t < 0) t = 1;

        else t = 0;

    }

    while (C.back() == 0 && C.size() > 1)

        C.pop_back();

    return C;

}

bool cmp(vector &A, vector &B) {

    if (A.size() != B.size())

        return A.size() > B.size();

    for (int i = 0; i < A.size(); i ++)

        if (A[i] != B[i]) return A[i] > B[i];

    return true;

}

int n;

int main() {

    while (cin >> n, n) {

        int a1 = 1, ans1 = 1;

        vector ans = {0};

        while (n --) {

            string a;

            vector A;

            cin >> a;

           

            if (a[0] == '-') {

                a1 = 0;

                for (int i = a.size() - 1; i > 0; i --)

                    A.push_back(a[i] - '0');

            } else {

                for (int i = a.size() - 1; i >= 0; i --)

                    A.push_back(a[i] - '0');

                a1 = 1;

            }

           

            if (cmp(ans, A)) {

                if (ans1 && a1) ans = add(ans, A), ans1 = 1;

                else if (ans1 && !a1) ans = sub(ans, A), ans1 = 1;

                else if (!ans1 && !a1) ans = add(ans, A), ans1 = 0;

                else ans = sub(ans, A), ans1 = 0;

            } else {

                if (ans1 && a1) ans = add(ans, A), ans1 = 1;

                else if (ans1 && !a1) ans = sub(A, ans), ans1 = 0;

                else if (!ans1 && !a1) ans = add(ans, A), ans1 = 0;

                else ans = sub(A, ans), ans1 = 1;

            }

        }

       

        if (!ans1 && ans[0]) cout << '-';

        for (int i = ans.size() - 1; i >= 0; i --)

            cout << ans[i];

       

        cout << endl;

    }

    return 0;

}

7-18 求最大公约数

#include

using namespace std;

int f;

int a, b;

int gcd(int a, int b) {

    if (a % b == 0) return b;

    else {

//         if (f) cout << ' ';

        printf(" gcd(%d,%d)", b, a % b);

        return gcd(b, a % b);

    }

}

int main() {

    cin >> a >> b;

    printf("gcd(%d,%d)", a, b);

    int res = gcd(a, b);

    cout << ' ' << res;

    return 0;

}

7-19 二分查找

#include

using namespace std;

const int N = 1010;

int n, arr[N], x, cnt;

int main() {

    cin >> n;

    for (int i = 0; i < n; i ++)

        cin >> arr[i];

    cin >> x;

    int l = 0, r = n - 1;

    while (l <= r) {

        int mid = (l + r) >> 1;

        if (arr[mid] > x) r = mid - 1,cnt ++;

        else if (arr[mid] < x) l = mid + 1, cnt ++;

        else {

            cnt ++;

            cout << mid << endl << cnt << endl;

            return 0;

        }

    }

    cout << -1 << endl << cnt << endl;

    return 0;

}

7-20 全排列(分治)

#include

using namespace std;

const int N = 1010;

int path[N], n;

void dfs(int u) {

    if (u == n) {

        for (int i = 1; i <= n; i ++)

            cout << path[i] << ' ';

        cout <

        return ;

    }

    for (int i = u; i <= n; i ++) {

        swap(path[i], path[u]);

        dfs(u + 1);

        swap(path[u], path[i]);

       

    }

}

int main() {

    cin >> n;

    for (int i = 1; i <= n; i ++)

        path[i] = i;

    dfs(1);

    return 0;

}

7-21 我是送分题

#include

#include

using namespace std;

const int mod = 1e9 + 7;

typedef long long LL;

// 结论需要推

struct Mx {

    LL g[3][3];

    Mx() {

        memset(g, 0, sizeof g);

    }

};

// 矩阵乘法 3 重循环

Mx mul(Mx a, Mx b) {

    Mx res;

    for (int i = 0; i < 3; i ++)

        for (int j = 0; j < 3; j ++) {

            LL sum = 0;

            for (int k = 0; k < 3; k ++)

                sum = (sum + a.g[i][k] * b.g[k][j]) % mod;

            res.g[i][j] = sum;

        }

    return res;

}

// 矩阵快速幂

Mx Mx_pow(Mx a, LL b) {

    Mx res;

    // 构造单位矩阵

    res.g[0][0] = res.g[1][1] = res.g[2][2] = 1;

   

    while (b) {

        if (b & 1) res = mul(res, a); // b & 1 判断 b 的末尾是否为 0

        a = mul(a, a);

        b >>= 1;

    }

    return res;

}

LL n;

Mx a;

int main() {

    cin >> n;

   

    // 目标矩阵

    a.g[0][0] = a.g[1][0] = a.g[2][1] = 1;

    a.g[0][1] = 2;

    a.g[0][2] = 3;

   

    a = Mx_pow(a, n - 3);

    LL ans[3][1], num[3][1];

    num[0][0] = 3, num[1][0] = 2, num[2][0] = 1;

   

    for (int i = 0; i < 3; i ++) {

        LL sum = 0;

        for (int j = 0; j < 3; j ++)

            sum = (sum + a.g[i][j] * num[j][0]) % mod;

        ans[i][0] = sum;

    }

    cout << ans[0][0] << endl;

    return 0;

}

7-22 二分查找

#include

#include

using namespace std;

const int N = 1010;

int n, x, t;

int main() {

    scanf("%d%d", &n, &x);

    for (int i = 0; i < n; i ++) {

        cin >> t;

        if (t >= x) {

            cout << i + 1;

            return 0;

        }

    }

    cout << n + 1 << endl;

    return 0;

}

7-23 程序设计综合实践 2.1

#include

#include

#include

using namespace std;

int main() {

    vectorans;

    int x;

    while (cin >> x) ans.push_back(x);

    sort(ans.begin(), ans.end());

    cout << ans[0] << ',' << ans[ans.size() - 1];

    return 0;

}

7-24 找第k小的数

#include

#include

using namespace std;

int main() {

    int n, m;

    cin >> n >> m;

    int a[n];

    for (int i = 0; i < n; i ++)

        cin >> a[i];

    sort(a, a + n);

    cout << a[m - 1] << endl;

    return 0;

}

7-25 第 k 大的整数**

#include

#include

using namespace std;

int main() {

    int n, m;

    cin >> n >> m;

    int a[n];

    for (int i = 0; i < n; i ++)

        scanf("%d", &a[i]);

    sort(a, a + n);

    cout << a[n - m] << endl;

    return 0;

}

7-26 0/1背包问题

#include

using namespace std;

const int N = 1010;

int n, m;

int v[N], w[N];

int f[N][N];

int maxv;

int main() {

    cin >> n >> m;

    for (int i = 1; i <= n; i ++)

        cin >> v[i] >> w[i];

   

    for (int i = n; i >= 0; i --) {

        for (int j = 1; j <= m; j ++) {

            f[i][j] = f[i + 1][j];

            if (j >= v[i]) {

                f[i][j] = max(f[i][j], f[i + 1][j - v[i]] + w[i]);

                maxv = f[i][j];

            }

        }

    }

   

    int j = m, t = 0;

    for (int i = 1; i <= n; i ++)

        if (j >= v[i] && f[i][j] == f[i + 1][j - v[i]] + w[i]) {

            cout << i << ' ', t = 1;

            j -= v[i];

        }

    if (!t) cout << "No" << endl << 0 << endl;

    else cout << endl << maxv << endl;

    return 0;

}

7-27 子集和问题

#include

using namespace std;

const int N = 1010;

int n, m;

int idx, sum;

int w[N], op[N];

void dfs(int idx, int sum) {

    if (idx > n || sum > m) return ;

    else if (sum == m) {

        for (int i = 0; i < n; i ++)

            if (op[i])

                cout << w[i] << ' ';

        cout << endl;

        return ;

    } else {

        op[idx] = 1;

        dfs(idx + 1, sum + w[idx]);

        op[idx] = 0;

        dfs(idx + 1, sum);

    }

}

int main() {

    cin >> n >> m;

    for (int i = 0; i < n; i ++)

        cin >> w[i];

    dfs(0, 0);

    return 0;

}

7-31 看电影

#include

#include

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[1010];

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() {

    while (cin >> n, n != 0) {

        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-28 幂集(回溯法)

#include

using namespace std;

const int N = 1010;

int n, arr[N], cnt;

int st[N];

void dfs(int a[], int n, int i, int st[]) {

    if (i >= n) cnt ++;

    else {

        st[i] = 1;

        dfs(a, n, i + 1, st);

        st[i] = 0;

        dfs(a, n, i + 1, st);

    }

}

int main() {

    cin >> n;

    for (int i = 0; i < n; i ++)

        cin >> arr[i];

    dfs(arr, n, 0, st);

    cout << cnt << endl;

    return 0;

}

7-31 看电影

#include

#include

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[1010];

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() {

    while (cin >> n, n != 0) {

        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-32 CPA招新Ⅰ

#include

using namespace std;

int main() {

    char e;

    int a = 0, b = 0, c = 0, d = 0;

    while ((e = getchar()) != '\n') {

        if (e == 'A') a ++;

        else if(e == 'B') b ++;

        else if (e == 'C') c ++;

        else if (e == 'D') d ++;

    }

    printf("Competition department %d people!\n", a);

    printf("Propaganda Department %d people!\n", b);

    printf("Office %d people!\n", c);

    printf("Organization Department %d people!\n", d);

    return 0;

}

7-33 多参加活动,生活才精彩

#include

#include

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, score = 0;

    for (int i = 0; i < n; i ++) {

        cin >> a[i].b >> a[i].e >> a[i].no;

//         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 (a[i].b >= pre) {

            pre = a[i].e;

//             cout << a[i].b << ' ' << a[i].e << endl;

            cnt ++;

            score += a[i].no;

        }

    }

    cout << cnt << ' ' << score << endl;

    return 0;

}

7-34 装箱问题

#include

using namespace std;

const int N = 1010;

int n, max_x = -1;

int a[N], b[N];

int main() {

    cin >> n;

    for (int i = 1; i<= n; i ++)

        cin >> a[i], b[i] = 100;

    for (int i = 1; i <= n; i ++) {

        for (int j = 1; j <= n; j ++) {

            if (a[i] <= b[j]) {

                b[j] -= a[i];

                cout << a[i] << ' ' << j << endl;

                max_x = max(max_x, j);

                    break;

            }

        }

    }

    cout << max_x << endl;

    return 0;

}

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

#include

#include

#include

using namespace std;

const int N = 1000005;

int t;

int main() {

    cin >> t;

    while (t --) {

        double c;

        vector 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

#include

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

#include

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

#include

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

#include

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

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

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

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

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

#include

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

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

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

#include

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

#include

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

#include

#include

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

struct NodeType {

    int no;

    char data;

    int weight;

    bool operator < (const NodeType &s) {

        return s.weight < weight;

    }

};

void init() {

    int i;

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

}

你可能感兴趣的:(算法分析,java,servlet,jvm)