zoukankan      html  css  js  c++  java
  • 川大邀请赛

    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 == '
    ');
    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 == '
    ');
    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
    ", 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
  • 相关阅读:
    hdu 1568 (log取对数 / Fib数通项公式)
    整数对(hdu1271)找规律
    Pupu(hdu3003)数论
    哈密顿绕行世界问题(hdu2181)
    Saving HDU(hdu2111,贪心)
    素数回文(hdu1431)
    Hashmat the brave warrior(UVa10055)简单题
    Moon Game (凸四边形个数,数学题)
    Zipper(poj2192)dfs+剪枝
    不要62(hdu2089)
  • 原文地址:https://www.cnblogs.com/yeahpeng/p/4438406.html
Copyright © 2011-2022 走看看