• 洛谷100题DAY6


    26.P1628 合并序列

    法一:

    1. #include
    2. using namespace std;
    3. const int N = 1e5 + 10;
    4. int n, cnt;
    5. string c, s[N], a[N];
    6. int main()
    7. {
    8. cin >> n;
    9. for(int i = 1; i <= n; i ++)
    10. {
    11. cin >> s[i];
    12. }
    13. cin >> c;
    14. int len = c.size();
    15. for(int i = 1; i <= n; i ++)
    16. {
    17. if(s[i].substr(0, len) == c)
    18. {
    19. cnt ++;
    20. a[cnt] = s[i];
    21. }
    22. }
    23. sort(a + 1, a + 1 + cnt);
    24. for(int i = 1; i <= cnt; i ++)
    25. {
    26. cout << a[i] << '\n';
    27. }
    28. return 0;
    29. }

    法二:

    使用find函数,其是指向搜索范围内第一个元素

    1. #include
    2. using namespace std;
    3. const int N = 1e5 + 10;
    4. int n, cnt;
    5. string c, s[N], a[N];
    6. int main()
    7. {
    8. cin >> n;
    9. for(int i = 1; i <= n; i ++)
    10. {
    11. cin >> s[i];
    12. }
    13. cin >> c;
    14. sort(s + 1, s + 1 + n);
    15. for(int i = 1; i <= n; i ++)
    16. {
    17. if(s[i].find(c) == 0)cout << s[i] << '\n';
    18. }
    19. return 0;
    20. }

    27.P1403 [AHOI2005] 约数研究

    约数个数 = 将约数拆解成每个质因子乘积的形式,每次将质因子出现的个数+1后相乘得到约数个数,普通一次一次模板计算会有超时现象

    1. #include
    2. using namespace std;
    3. typedef long long ll;
    4. const int N = 110, mod = 1e9 + 7;
    5. ll n, ans, primes[N];
    6. ll solve(int x)
    7. {
    8. unordered_map<int, int> primes;
    9. for(int i = 2; i <= x / i; i ++)
    10. {
    11. while(x % i == 0)
    12. {
    13. x /= i;
    14. primes[i] ++;
    15. }
    16. }
    17. if(x > 1)primes[x] ++;
    18. ll res = 1;
    19. for(auto i : primes)
    20. {
    21. res = res * (i.second + 1) % mod;
    22. }
    23. return res;
    24. }
    25. int main()
    26. {
    27. cin >> n;
    28. for(int i = 1; i <= n; i ++)
    29. {
    30. ans += solve(i);
    31. }
    32. cout << ans;
    33. return 0;
    34. }

    AC写法:

     每次到自己就将自己可以贡献的所有约数个数不断加起来

    1. #include
    2. using namespace std;
    3. int n, ans;
    4. int main()
    5. {
    6. cin >> n;
    7. for(int i = 1; i <= n; i ++)
    8. {
    9. for(int j = i; j <= n; j += i)
    10. {
    11. ans ++;
    12. }
    13. }
    14. cout << ans;
    15. return 0;
    16. }

    28.P1644 跳马问题

    法一:

    1. #include
    2. using namespace std;
    3. int dx[4] = {-2, -1, 1, 2};
    4. int dy[4] = {1, 2, 2, 1};
    5. int n, m, ans;
    6. void dfs(int x, int y)
    7. {
    8. if(x == m && y == n)
    9. {
    10. ans ++;
    11. return;
    12. }
    13. for(int i = 0; i < 4; i ++)
    14. {
    15. int a = x + dx[i];
    16. int b = y + dy[i];
    17. if(a >= 0 && a <= m && b >= 0 && b <= n)
    18. {
    19. dfs(a, b);
    20. }
    21. }
    22. }
    23. int main()
    24. {
    25. cin >> m >> n;
    26. dfs(0, 0);
    27. cout << ans;
    28. return 0;
    29. }

    法二:

    1. #include
    2. using namespace std;
    3. int dy[4] = {-2, -1, 1, 2};
    4. int dx[4] = {- 1, - 2, - 2, - 1};
    5. const int N = 1e3 + 10;
    6. int n, m, dp[N][N];
    7. int main()
    8. {
    9. cin >> n >> m;
    10. dp[0][0] = 1;
    11. for(int i = 0; i <= m; i ++)
    12. {
    13. for(int j = 0; j <= n; j ++)
    14. {
    15. for(int k = 0; k < 4; k ++)
    16. {
    17. int a = i + dx[k];
    18. int b = j + dy[k];
    19. if(a < 0 || a > m || b < 0 || b > n)continue;
    20. dp[i][j] += dp[a][b];
    21. }
    22. }
    23. }
    24. cout << dp[m][n];
    25. }

    29.P1122 最大子树和

    将每朵花的两条边相连,进行dfs,传入两个参数即为当前节点与当前节点的父亲节点,dp[x]为当前节点的值,将与当前节点的值循环遍历一遍,如果现节点是当前节点的父亲则跳过,因为其是不断向下递归,只用向下的点是大于0的则一定会对答案有所贡献,现在每一个dp的值都代表了自己所能到达的最大范围,最后将每一个点遍历,找出最大的那个可以取到的和

    1. #include
    2. using namespace std;
    3. const int N = 1e6 + 10;
    4. int n, u, v, w[N], dp[N];
    5. vector<int> g[N];
    6. void dfs(int x, int fa)
    7. {
    8. dp[x] = w[x];
    9. for(auto y : g[x])
    10. {
    11. if(y == fa)continue;
    12. dfs(y, x);
    13. if(dp[y] > 0)dp[x] += dp[y];
    14. }
    15. }
    16. int main()
    17. {
    18. cin >> n;
    19. for(int i = 1; i <= n; i ++)cin >> w[i];
    20. for(int i = 1; i <= n - 1; i ++)
    21. {
    22. cin >> u >> v;
    23. g[u].push_back(v);
    24. g[v].push_back(u);
    25. }
    26. dfs(1, 0);
    27. int ans = w[1];
    28. for(int i = 1; i <= n; i ++)
    29. {
    30. ans = max(ans, dp[i]);
    31. }
    32. cout << ans;
    33. return 0;
    34. }

    30.P1510 精卫填海

    dp[i]表示到目前为止,得到总体积为i的木石所需的最小体力,输出最大体力相减即可

    1. #include
    2. using namespace std;
    3. const int N = 1e5 + 10;
    4. int v, n, c, k[N], m[N], dp[N];
    5. //dp[i]表示到目前为止,得到总体积为i的木石所需的最小体力
    6. int main()
    7. {
    8. cin >> v >> n >> c;
    9. for(int i = 1; i <= n; i ++)
    10. {
    11. cin >> k[i] >> m[i];
    12. }
    13. memset(dp, 0x3f, sizeof dp);
    14. dp[0] = 0;
    15. for(int i = 1; i <= n; i ++)
    16. {
    17. for(int j = 1e4 + 10; j >= k[i]; j --)
    18. {
    19. dp[j] = min(dp[j], dp[j - k[i]] + m[i]);
    20. }
    21. }
    22. int ans = dp[v];
    23. for(int i = v; i <= 2e4; i ++)
    24. {
    25. ans = min(ans, dp[i]);
    26. }
    27. if(c >= ans)cout << c - ans;
    28. else cout << "Impossible" << '\n';
    29. return 0;
    30. }
  • 相关阅读:
    尚硅谷ES6复习总结上(64th)
    SQL server从安装到入门(一)
    《第一行代码》读书笔记(1)—系统架构
    11.6 知识总结(筛选器方法、操作标签、事件)
    clickhouse使用clickhouse-keeper代替zookeeper
    基于观察者模式设计的框架-REB,使代码模块化
    什么是数据可视化,为什么数据可视化很重要?
    python基础之面向对象
    SpringBoot集成JSR并使用
    基于最小负荷初始化的改进遗传算法求解柔性作业车间调度问题
  • 原文地址:https://blog.csdn.net/m0_75087931/article/details/133074094