可能題目的順序不一樣,但是題目應該是一樣的。
1.一條街有n個位置,每個位置需要照亮的話用 . 表示,不需要照亮的話用 X 表示,每盞路燈能照亮,i - 1, i , i + 1三個位置,問最少用多少路燈,能照亮所有要求的位置。
/************************************************************************* > File Name: A.cpp > Author: LyuCheng > Created Time: 2018-03-27 19:04 > Description: 問題的實質到最后實際上就是遍歷一遍,遇到一個.不管后邊兩 個是什么,統統在i + 1的位置按上一個路燈,思考一下是不是? ************************************************************************/ #include <bits/stdc++.h> #define MAXN 1234 using namespace std; int t; int n; char str[MAXN]; int ans; inline void init() { memset(str, '\0', sizeof str); ans = 0; } int main(int argc, char**argv) { freopen ("in.txt", "r", stdin); scanf ("%d", &t); while (t --) { init(); scanf ("%d", &n); scanf ("%s", str); for (int i = 0; i < n; i ++) { if (str[i] == 'X') continue; else { ans ++; for (int j = i; j < n && j < i + 3; j ++) str[j] = 'X'; } } printf("%d\n", ans); } return 0; }
2.有這樣一種序列,1,12,123, ... 123456910111213
問你區間[l, r]中有多少項不能被3整除。
/************************************************************************* > File Name: B.cpp > Author: LyuCheng > Created Time: 2018-03-27 20:09 > Description: 打表找個規律,第i項:i % 3 == 0這一項就能被3整除 ************************************************************************/ #include <bits/stdc++.h> using namespace std; int l, r; int a, b; inline void init() { a = 0; b = 0; } int main(int argc, char**argv) { init(); scanf ("%d %d", &l, &r); l --; a += (l / 3) * 2; if (l % 3 != 0) a += (l % 3 - 1); b += (r / 3) * 2; if (r % 3 != 0) b += (r % 3 - 1); printf("%d\n", b - a); return 0; }
3.去野餐有n種物品,一個容量為w的背包,(1 <= w <= 2e9) 每件物品 v[i] (0 <= v[i] <= 1e9),有多少種裝法,是的物品總體積不超過w
/************************************************************************* > File Name: C.cpp > Author: LyuCheng > Created Time: 2018-03-27 20:21 > Description: 這個題正解應該是每次枚舉到一個大於w的狀態i,就能排除后邊 很多狀態(如果 (j & i) == i (j > i),那么這個狀態就被排除了),所以 時間負責度會減少很多,記憶化搜索就可以了。 但是筆試時間不多了,我耍了個小聰明,只記錄最后一個不能的狀態,用來 排除狀態,結果就卡過了。 ************************************************************************/ #include <bits/stdc++.h> #define MAXN 34 #define LL long long using namespace std; int n; LL w; LL v[MAXN]; LL sum; LL ans; inline void init() { sum = 0; ans = 0; } int main(int argc, char**argv) { init(); scanf ("%d %lld", &n, &w); for (int i = 0; i < n; i ++) { scanf ("%lld", &v[i]); sum += v[i]; } if (sum <= w) { printf("%lld\n", (LL)(1 << n)); exit(0); } LL pos = (1 << n); for (LL i = 0; i < (1 << n); i ++) { if ((i & pos) == pos) { continue; } LL s = 0; for (LL j = 0; j < n; j ++) { if ((i & (1 << j)) != 0) { s += v[j]; } if (s > w) { pos = i; break; } } if (s <= w) ans ++; } printf("%lld\n", ans); return 0; }
