• [hihocoder][Offer收割]编程练习赛64


    公平划分

    若条件满足,则所有数异或和为零,这时候随便分都可以,答案为2^n-2,否则答案为0

    #pragma comment(linker, "/STACK:102400000,102400000")
    #ifndef ONLINE_JUDGE
    #include "stdafx.h"
    #else
    #include<bits/stdc++.h>
    #endif
    using namespace std;
    typedef long long lint;
    typedef vector<int> VI;
    typedef pair<int, int> PII;
    typedef queue<int> QI;
    typedef map<int, int> MII;
    
    void makedata() {
        freopen("input.txt", "w", stdout);
        fclose(stdout);
    }
    
    int n;
    lint a[100];
    
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        //makedata();
        std::ios::sync_with_stdio(0), cin.tie(0);
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        lint x = a[0];
        for (int i = 1; i < n; i++) x ^= a[i];
        if (x != 0) cout << 0 << endl;
        else cout << (1LL << n) - 2 << endl;
        return 0;
    }
    View Code

    配对

    状态压缩,dp[i][j]表示进行到第j个女生,所有男生匹配状况为i时的方案数

    #pragma comment(linker, "/STACK:102400000,102400000")
    #ifndef ONLINE_JUDGE
    #include "stdafx.h"
    #else
    #include<bits/stdc++.h>
    #endif
    using namespace std;
    typedef long long lint;
    typedef vector<int> VI;
    typedef pair<int, int> PII;
    typedef queue<int> QI;
    typedef map<int, int> MII;
    
    void makedata() {
        freopen("input.txt", "w", stdout);
        fclose(stdout);
    }
    
    lint dp[5000][15];
    
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        //makedata();
        std::ios::sync_with_stdio(0), cin.tie(0);
        int n, a[15], b[15];
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i];
        for (int i = 1; i <= n; i++) cin >> b[i];
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j < (1 << n); j++) {
                for (int k = 1; k <= n; k++) {
                    if (!(j & (1 << (k - 1))) && a[k] <= b[i]) {
                        dp[j + (1 << (k - 1))][i] += dp[j][i - 1];
                    }
                }
            }
        }
        cout << dp[(1 << n) - 1][n] << endl;
        return 0;
    }
    View Code

    字符串问题

    贪心

    #pragma comment(linker, "/STACK:102400000,102400000")
    #ifndef ONLINE_JUDGE
    #include "stdafx.h"
    #else
    #include<bits/stdc++.h>
    #endif
    using namespace std;
    typedef long long lint;
    typedef vector<int> VI;
    typedef pair<int, int> PII;
    typedef queue<int> QI;
    typedef map<int, int> MII;
    
    void makedata() {
        freopen("input.txt", "w", stdout);
        fclose(stdout);
    }
    string s;
    int a[26][110000];
    int find(int l, int r, int c) {
        if (l >= r) return -1;
        int sum;
        if (l == 0) sum = a[c][r - 1];
        else sum = a[c][r - 1] - a[c][l - 1];
        if (sum == 0) return -1;
        if (l + 1 == r) {
            if (s[l] - 'a' == c) return l;
            else return -1;
        }
        int mid = (l + r) / 2;
        int ll = find(l, mid, c);
        if (ll != -1) return ll;
        else return find(mid, r, c);
    }
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        //makedata();
        std::ios::sync_with_stdio(0), cin.tie(0);
        cin >> s;
        int n = s.length();
        memset(a, 0, sizeof(a));
        a[s[0] - 'a'][0] = 1;
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < 26; j++) a[j][i] = a[j][i - 1];
            a[s[i] - 'a'][i]++;
        }
        int m = 1, ans = 1;
        while (m < n) {
            if (find(0, m, (int)(s[m] - 'a')) == -1) m++, ans++;
            else {
                int l = -1, p = m;
                while (p < n) {
                    l = find(l + 1, m, (int)(s[p] - 'a'));
                    if (l == -1) {
                        m = p;
                        ans++;
                        break;
                    }
                    p++;
                }
                m = p;
                if (p == n) ans++;
            }
        }
        cout << ans << endl;
        return 0;
    }
    View Code

    公共山峰

    emmm...

  • 相关阅读:
    [php]php设计模式 Command(命令模式)
    [php]php设计模式 Observer(观察者模式)
    [转]Ubuntu 系统安装极点五笔
    [转] 关于开源协议
    上传大小限制设置
    php开启安全模式后禁用的函数
    [php]php设计模式 Template (模板模式)
    [php]php设计模式 Singleton(单例模式)
    [php]php设计模式 Strategy(策略模式)
    [转]调优您的 LAMP 应用程序的 5 种简单方法
  • 原文地址:https://www.cnblogs.com/dramstadt/p/9209286.html
Copyright © 2020-2023  润新知