Codeforces Round #213(Div. 2) 不徹底不正確題解

比賽地址:戳我python

A. Good Number

關鍵:ios

Let's call a number k-good if it contains all digits not exceeding k (0, ..., k). git

即,給出的數必須包括[0...k]全部數字。超出範圍的數字忽略不計spa

一個小坑。注意讀題。code

B. The Fibonacci Segment

找出給出數列的最長子列,使這個子列知足: a[i] + a[i + 1] == a[i + 2]ci

同時,長度爲1 或 2的子列均認爲知足條件。get

此題須要一個小小的證實,我不知道怎麼表達。看代碼就好,很簡單的思路。input

C. Matrix

一道中等題。string

對於一個子矩陣來講,其和必須爲: sum(a[i...j]) * sum(a[x...y])it

因此咱們用O(n^2)的時間複雜度枚舉出s的全部子串和,以及全部子串和出現的次數。

若是 M = sum(a[i...j]), 同時cnt[M] = u;
則推出 N = a / M; //注:M爲0的狀況再討論
獲得cnt[N] = v;
則 ans += u * v;

當上述僞代碼中的M爲0時,若是a == 0,則N必須爲全部子串和的種數。

若是a != 0,則N必爲0。(由於0 * M == 0 != a)

被得0狀況小坑了幾回,以後把這題切掉了。

D. Free Market

其實這題算一道簡單題。

由於題目中給出公式s(x) + d < s(y)。根據此式咱們能夠推出,不管咱們擁有什麼寶貝。下一輪交換的結果必定知足以下兩個條件。

A[i + 1] > A[i];
A[i + 1] <= A[i] + d;

A[i]表示的是第i輪咱們擁有的寶貝的總價值。

對於A[i],咱們能夠用揹包DP來求得其可能的值。

因而此題就轉化爲:揹包DP + 一個while循環。能夠歸爲簡單題。可是有一點思路上的小彎。

E. Beautiful Set

TODO:此題不會,我須要一個證實。。。坐等題解。


A. Good Number

import sys

sys.stdin = open("input.txt")

(n, k) = map(int, raw_input().split())

res = 0

for i in xrange(n):
    s = map(int, raw_input())
    st = set()
    for item in s:
        if item > k:
            pass
        else:
            st.add(item)
    else:
        if len(st) == k + 1:
            res += 1
            #print s, 'yes'

print res

B. The Fibonacci Segment

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define print(x) cout << x << endl
#define input(x) cin >> x

const int SIZE = 100100;

int n;
int A[SIZE];

int judge(int &t)
{
    int st = t - 1 >= 0? t - 1: t;
    int res = 0;
    for (int i = 0; st + i < n; i++) {
        if (i >= 2 && 
                A[st + i - 1] + A[st + i - 2] == A[st + i]) {
            res = i + 1;
        } else if (i < 2) {
            res++;
            continue;
        } else {
            break;
        }
    }
    t = st + res;
    return res;
}

int main()
{
    freopen("input.txt", "r", stdin);
    while(input(n)) {
        for (int i = 0; i < n; i++) {
            input(A[i]);
        }
        int ans = 0;
        int t = 0;
        while (t < n) {
            int res = judge(t);
            //print(t);
            ans = max(ans, res);
        }

        print(ans);
    }
    return 0;
}

C. Matrix

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>

using namespace std;

#define print(x) cout << x << endl
#define input(x) cin >> x

typedef long long llint;

const int SIZE = 4444;

llint a;
int len;
char val[SIZE];
map<llint, int> mp;

int main()
{
    freopen("input.txt", "r", stdin);
    while (input(a)) {
        llint ans = 0;
        input(val);
        len = strlen(val);
        mp.clear();
        int sumall = 0;
        for (int i = 0; i < len; i++) {
            val[i] -= '0';
        }

        for (int i = 1; i <= len; i++) {
            llint t = 0;
            for (int j = 0; j < i; j++) {
                t += val[j];
            }
            mp[t]++;
            sumall++;
            for (int j = i; j < len; j++) {
                t -= val[j - i];
                t += val[j];
                mp[t]++;
                sumall++;
            }
        }
        for (map<llint, int>::iterator iter = mp.begin();
                iter != mp.end();
                ++iter) {
            llint x = iter -> first;
            int y = iter -> second;
            //print(x << ' ' << y);
            if (!x) {
                if (!a) {
                    ans += (llint)sumall * y;
                }
                continue;
            }
            if (a % x == 0) {
                int z = mp[a / x];
                ans += (llint)y * z;
            }
        }
        print(ans);
    }

    return 0;
}

D. Free Market

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define print(x) cout << x << endl
#define input(x) cin >> x

const int N = 55;
const int D = 10100;

char dp[N * D];
int n, d;
int A[N];

void do_package()
{
    memset(dp, 0, sizeof(dp));
    dp[0] = 1;
    for (int i = 0; i < n; i++) {
        for (int j = N * D - 1; j >= 0; j--) {
            if (dp[j] && j + A[i] < N * D) {
                dp[j + A[i]] = 1;
            }
        }
    }
}

void solve(int &val, int &day)
{
    val = day = 0;
    while (1) {
        bool flag = false;
        for (int i = val + d; i > val; i--) {
            if (dp[i]) {
                val = i;
                day++;
                flag = true;
                break;
            }
        }
        if (!flag) break;
    }
}


int main()
{
    freopen("input.txt", "r", stdin);
    while (input(n >> d)) {
        for (int i = 0; i < n; i++) {
            input(A[i]);
        }
        do_package();

        int a, b;
        solve(a, b);
        print(a << ' ' << b);
    }
    return 0;
}

E. Beautiful Set

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

#define print(x) cout << x << endl
#define input(x) cin >> x

const int prime[15] = {2, 3, 5, 7, 11,
                     13, 17, 19, 23, 29,
                     31, 37, 41, 43, 47};


int main()
{
    int n;
    input(n);
    vector<int> res;
    int limit = 2 * n * n;

    for (int i = 0; i < 15; i++) {
        res.clear();
        res.push_back(1);
        for (int j = 0; j <= i; j++) {
            int p = prime[j];
            int sz = res.size();
            for (int k = 0; k < sz; k++) {
                int x = res[k];
                while (x * p <= limit) {
                    x *= p;
                    res.push_back(x);
                }
            }
        }
        if (res.size() >= n) {
            break;
        }
    }
    sort(res.begin(), res.end(), greater<int>());
    for (int i = 0; i < n; i++) {
        if (i) printf(" ");
        printf("%d", res[i]);
    }
    puts("");
    return 0;
}
相關文章
相關標籤/搜索