比賽地址:戳我python
關鍵:ios
Let's call a number k-good if it contains all digits not exceeding k (0, ..., k). git
即,給出的數必須包括[0...k]全部數字。超出範圍的數字忽略不計。spa
一個小坑。注意讀題。code
找出給出數列的最長子列,使這個子列知足: a[i] + a[i + 1] == a[i + 2]。ci
同時,長度爲1 或 2的子列均認爲知足條件。get
此題須要一個小小的證實,我不知道怎麼表達。看代碼就好,很簡單的思路。input
一道中等題。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狀況小坑了幾回,以後把這題切掉了。
其實這題算一道簡單題。
由於題目中給出公式s(x) + d < s(y)
。根據此式咱們能夠推出,不管咱們擁有什麼寶貝。下一輪交換的結果必定知足以下兩個條件。
A[i + 1] > A[i]; A[i + 1] <= A[i] + d;
A[i]表示的是第i輪咱們擁有的寶貝的總價值。
對於A[i],咱們能夠用揹包DP來求得其可能的值。
因而此題就轉化爲:揹包DP + 一個while循環。能夠歸爲簡單題。可是有一點思路上的小彎。
TODO:此題不會,我須要一個證實。。。坐等題解。
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
#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; }
#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; }
#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; }
#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; }