[hihocoder][Offer收割]編程練習賽64

公平劃分ios

若條件知足,則全部數異或和爲零,這時候隨便分均可以,答案爲2^n-2,不然答案爲0c++

#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

配對ide

狀態壓縮,dp[i][j]表示進行到第j個女生,全部男生匹配情況爲i時的方案數spa

#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

字符串問題3d

貪心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

公共山峯blog

emmm...ci

相關文章
相關標籤/搜索