川大邀请赛

4423:Necklace

一道计数问题,当时不会敲,先留着

4424:Permutations

签到题

 1 /***Good Luck***/
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include <iostream>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cstring>
 7 #include <string>
 8 #include <algorithm>
 9 #include <stack>
10 #include <map>
11 #include <queue>
12 #include <vector>
13 #include <set>
14 #include <functional>
15 #include <cmath>
16 #include <numeric>
17 
18 #define ll long long
19 #define Zero(x)  memset((x),0, sizeof(x))
20 #define Neg(x) memset((x), -1, sizeof(x))
21 #define dg(x) cout << #x << " = " << x << endl
22 #define pk(x)   push_back(x)
23 #define pok()   pop_back()
24 #define pii pair<int, int>
25 using namespace std;
26 int OK = 1;
27 bool debug = false;
28 void get_val(int &a) {
29     int value = 0, s = 1;
30     char c;
31     while ((c = getchar()) == ' ' || c == '\n');
32     if (c == '-') s = -s; else value = c - 48;
33     while ((c = getchar()) >= '0' && c <= '9')
34         value = value * 10 + c - 48;
35     a = s * value;
36 }
37 const int maxn = 8000100;
38 int mod = 1000000007;
39 ll arr[maxn] = {0};
40 int main(){
41     //freopen("data.out", "w", stdout);
42     //freopen("data.in", "r", stdin);
43     //cin.sync_with_stdio(false);
44     for(int i = 0; i < maxn; ++i){
45         arr[i] = arr[i- 1] * i + i;
46         arr[i] %= mod;
47     }
48     int T;
49     cin >> T;
50     int n;
51     while(T--){
52         cin >> n;
53         cout << arr[n] << endl;
54     }
55     return 0;
56 }
View Code

 

4426:Counting_3

f(3k + 1)  = f(3k + 2) = f(k)

f(3k) = f(k) + f(k - 1)

由上公式,可推出 x = p3^y  f(x) = f(p) + y(p - 1)

还要注意记忆化搜索

 1 /***Good Luck***/
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include <iostream>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cstring>
 7 #include <string>
 8 #include <algorithm>
 9 #include <stack>
10 #include <map>
11 #include <queue>
12 #include <vector>
13 #include <set>
14 #include <functional>
15 #include <cmath>
16 #include <numeric>
17 
18 #define ll long long
19 #define Zero(x)  memset((x),0, sizeof(x))
20 #define Neg(x) memset((x), -1, sizeof(x))
21 #define dg(x) cout << #x << " = " << x << endl
22 #define pk(x)   push_back(x)
23 #define pii pair<int, int>
24 using namespace std;
25 int OK = 1;
26 bool debug = true;
27 void get_val(ll &a) {
28       ll value = 0, s = 1;
29       char c;
30       while ((c = getchar()) == ' ' || c == '\n');
31       if (c == '-') s = -s; else value = c-48;
32       while ((c = getchar()) >= '0' && c <= '9')
33           value = value * 10 + c - 48;
34       a = s * value;
35 }
36 const int maxn = 10000000;
37 int ans[maxn] = {0};
38 int dfs(ll v){
39     if(v <= 0) return 1;
40     while(v % 3){
41         v -= v % 3;
42         v /= 3;
43     }
44     if(v == 0) return 1;
45     int c = 0;
46     while(v % 3 == 0){
47         v /= 3;
48         c++;
49     }
50     if(v < maxn && !ans[v - 1])
51         ans[v - 1] = dfs(v - 1);
52 
53     if(v < maxn && !ans[v]) ans[v] = dfs(v);
54     if(v > maxn) {
55         return c * dfs(v - 1) + dfs(v);
56     }
57     return ans[v] + c * ans[v - 1];
58 }
59 int main() {
60     //freopen("data.out", "w", stdout);
61     //freopen("data.in", "r", stdin);
62     //cin.sync_with_stdio(false);
63     int T;
64     scanf("%d", &T);
65 
66     ll n;
67     while(T--){
68         get_val(n);
69         printf("%d\n", dfs(n));
70     }
71 
72 }
View Code

4427:Miss Zhao's Graph

cf上原题, dp + 贪心

 1 /***Good Luck***/
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include <iostream>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cstring>
 7 #include <string>
 8 #include <algorithm>
 9 #include <stack>
10 #include <map>
11 #include <queue>
12 #include <vector>
13 #include <set>
14 #include <functional>
15 #include <cmath>
16 
17 
18 #define Zero(a) memset(a, 0, sizeof(a))
19 #define Neg(a)  memset(a, -1, sizeof(a))
20 #define All(a) a.begin(), a.end()
21 #define PB push_back
22 #define inf 0x3f3f3f3f
23 #define inf2 0x7fffffffffffffff
24 #define ll long long
25 using namespace std;
26 //#pragma comment(linker, "/STACK:102400000,102400000")
27 const int maxn = 300005;
28 int dp[maxn], dp2[maxn];
29 int rec[maxn];
30 int n, e;
31 struct node {
32     int u, v;
33     int w;
34 }edge[maxn];
35 
36 
37 bool cmp(node a, node b) {
38     return a.w < b.w;
39 }
40 int main() {
41     //freopen("data.out", "w", stdout);
42     //freopen("data.in", "r", stdin);
43     //cin.sync_with_stdio(false);
44     int T;
45     cin >> T;
46     while(T--){
47     Zero(dp);
48     Zero(dp2);
49     scanf("%d%d", &n, &e);
50     int u, v, w;
51     for (int i = 0; i < e; ++i) {
52         scanf("%d%d%d", &u, &v, &w);
53         edge[i].u = u;
54         edge[i].v = v;
55         edge[i].w = w;
56     }
57     sort(edge, edge + e, cmp);
58     int j;
59     for (int i = 0; i < e; ++i) {
60         for (j = i; j < e && edge[j].w == edge[i].w; ++j);
61 
62         for (int k = i; k < j; ++k) {
63             dp2[edge[k].v] = max(dp2[edge[k].v], dp[edge[k].u] + 1);
64         }
65         for (int k = i; k < j; ++k) {
66             dp[edge[k].v] = dp2[edge[k].v];
67         }
68         i = j - 1;
69     }
70     int ans = 0;
71     for (int i = 1; i <= n; ++i) {
72         ans = max(ans, dp[i]);
73     }
74     cout << ans << endl;
75     }
76     return 0;
77 }
View Code

4429:frog's dice

二分图多重匹配题, 把最后的匹配串相同字符合并,次数+1

 1 /***Good Luck***/
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include <iostream>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cstring>
 7 #include <string>
 8 #include <algorithm>
 9 #include <stack>
10 #include <map>
11 #include <queue>
12 #include <vector>
13 #include <set>
14 #include <functional>
15 #include <cmath>
16 
17 
18 #define Zero(a) memset(a, 0, sizeof(a))
19 #define Neg(a)  memset(a, -1, sizeof(a))
20 #define All(a) a.begin(), a.end()
21 #define PB push_back
22 #define inf 0x3f3f3f3f
23 #define inf2 0x7fffffffffffffff
24 #define ll long long
25 using namespace std;
26 //#pragma comment(linker, "/STACK:102400000,102400000")
27 const int maxn = 300005;
28 int dp[maxn], dp2[maxn];
29 int rec[maxn];
30 int n, e;
31 struct node {
32     int u, v;
33     int w;
34 }edge[maxn];
35 
36 
37 bool cmp(node a, node b) {
38     return a.w < b.w;
39 }
40 int main() {
41     //freopen("data.out", "w", stdout);
42     //freopen("data.in", "r", stdin);
43     //cin.sync_with_stdio(false);
44     int T;
45     cin >> T;
46     while(T--){
47     Zero(dp);
48     Zero(dp2);
49     scanf("%d%d", &n, &e);
50     int u, v, w;
51     for (int i = 0; i < e; ++i) {
52         scanf("%d%d%d", &u, &v, &w);
53         edge[i].u = u;
54         edge[i].v = v;
55         edge[i].w = w;
56     }
57     sort(edge, edge + e, cmp);
58     int j;
59     for (int i = 0; i < e; ++i) {
60         for (j = i; j < e && edge[j].w == edge[i].w; ++j);
61 
62         for (int k = i; k < j; ++k) {
63             dp2[edge[k].v] = max(dp2[edge[k].v], dp[edge[k].u] + 1);
64         }
65         for (int k = i; k < j; ++k) {
66             dp[edge[k].v] = dp2[edge[k].v];
67         }
68         i = j - 1;
69     }
70     int ans = 0;
71     for (int i = 1; i <= n; ++i) {
72         ans = max(ans, dp[i]);
73     }
74     cout << ans << endl;
75     }
76     return 0;
77 }
View Code

 

posted @ 2015-04-18 23:43  yeahpeng  阅读(153)  评论(0编辑  收藏  举报