当前位置:   article > 正文

牛客周赛 Round 18_游游拿到一个正整数x,她希望把这个数的前k位进行翻转

游游拿到一个正整数x,她希望把这个数的前k位进行翻转

牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)

A-游游的整数翻转_牛客周赛 Round 18 (nowcoder.com)

题目描述 

游游拿到了一个正整数�x,她希望把这个整数的前�k位进行翻转。你能帮帮她吗?

简单的字符串操作

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int k;
  6. string s;
  7. cin >> s >> k;
  8. int n = s.size();
  9. string t = s.substr(0,k);
  10. reverse(t.begin(),t.end());
  11. while(t.size() && t[0] == '0')t.erase(0,1);
  12. string ans = t + s.substr(k,n);
  13. cout << ans << endl;
  14. return 0;
  15. }

Java版

  1. import java.util.Scanner;
  2. public class Main
  3. {
  4. public static void main(String[] args)
  5. {
  6. Scanner sc = new Scanner(System.in);
  7. String s = sc.next();
  8. int k = sc.nextInt();
  9. int n = s.length();
  10. String t = s.substring(0, k);
  11. t = new StringBuilder(t).reverse().toString();
  12. while (t.length() > 0 && t.charAt(0) == '0')
  13. t = t.substring(1);
  14. String ans = t + s.substring(k, n);
  15. System.out.println(ans);
  16. }
  17. }

 

 B-游游的排列统计_牛客周赛 Round 18 (nowcoder.com)

游游想知道,有多少个长度为nnn的排列满足任意两个相邻元素之和都不是素数。你能帮帮她吗?

我们定义,长度为nnn的排列值一个长度为nnn的数组,其中1到nnn每个元素恰好出现了一次。

小数素数判断 + 全排列即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. bool No_prime[20];
  4. void Init()
  5. {
  6. for(int i = 3; i < 20; i++)
  7. {
  8. for(int j = 2;j < i;j++)
  9. if(!(i % j))No_prime[i] = true;
  10. }
  11. }
  12. int a[11];
  13. int main()
  14. {
  15. Init();
  16. int n;cin >> n;
  17. int ans = 0;
  18. for(int i = 1;i <= 10;i++)a[i] = i;
  19. do
  20. {
  21. bool is = true;
  22. for(int i = 1;i < n;i++)
  23. {
  24. if(false == No_prime[a[i] + a[i + 1]])
  25. {
  26. is = false;
  27. break;
  28. }
  29. }
  30. ans += is;
  31. }while(next_permutation(a + 1,a + 1 + n));
  32. cout << ans << endl;
  33. return 0;
  34. }

Java版

  1. import java.util.*;
  2. public class Main
  3. {
  4. static boolean[] No_prime = new boolean[20];
  5. static int[] a = new int[11];
  6. public static void init()
  7. {
  8. for (int i = 3; i < 20; i++)
  9. for (int j = 2; j < i; j++)
  10. if (i % j == 0)
  11. {
  12. No_prime[i] = true;
  13. break;
  14. }
  15. }
  16. public static void main(String[] args)
  17. {
  18. init();
  19. Scanner scanner = new Scanner(System.in);
  20. int n = scanner.nextInt();
  21. int ans = 0;
  22. for (int i = 1; i <= 10; i++)a[i] = i;
  23. do
  24. {
  25. boolean is = true;
  26. for (int i = 1; i < n; i++)
  27. if (!No_prime[a[i] + a[i + 1]])
  28. {
  29. is = false;
  30. break;
  31. }
  32. ans += is ? 1 : 0;
  33. } while (next_permutation(a, 1, 1 + n));
  34. System.out.println(ans);
  35. }
  36. public static boolean next_permutation(int[] a, int l, int r)
  37. {
  38. int i = r - 1;
  39. while (i > l && a[i - 1] >= a[i])i--;
  40. if (i <= l)return false;
  41. int j = r - 1;
  42. while (a[j] <= a[i - 1])j--;
  43. int temp = a[i - 1];
  44. a[i - 1] = a[j];
  45. a[j] = temp;
  46. j = r - 1;
  47. while (i < j)
  48. {
  49. temp = a[i];
  50. a[i] = a[j];
  51. a[j] = temp;
  52. i++;
  53. j--;
  54. }
  55. return true;
  56. }
  57. }

 C-游游刷题_牛客周赛 Round 18 (nowcoder.com)

游游制定了一个刷题计划,她找到了nnn套试卷,每套试卷的题目数量为aia_iai​。游游每天上午最多打开一套试卷,下午最多打开一套试卷,也可以选择不刷题而摸鱼。当游游打开一套试卷后,她就会把上面的题目全部刷完。但是游游有强迫症,她希望每天刷的题目总数均为kkk的倍数。请你计算游游最多能刷多少天的题? 

思路类似力扣中的俩数之和,很好理解。 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e5 + 10;
  4. int a[maxn];
  5. int main()
  6. {
  7. int ans = 0;
  8. int n, k;cin >> n >> k;
  9. map<int,int>M;
  10. for(int i = 1;i <= n;i++)
  11. {
  12. int m;cin >> m;
  13. if(m % k == 0)ans++;
  14. else
  15. {
  16. int p = m % k;
  17. if(M[k - p] > 0)
  18. {
  19. ans++;
  20. M[k - p]--;
  21. }
  22. else
  23. M[m % k]++;
  24. }
  25. }
  26. cout << ans << endl;
  27. return 0;
  28. }

 Java版

  1. import java.util.*;
  2. public class Main
  3. {
  4. public static void main(String[] args)
  5. {
  6. Scanner scanner = new Scanner(System.in);
  7. int ans = 0;
  8. int n = scanner.nextInt();
  9. int k = scanner.nextInt();
  10. Map<Integer, Integer> M = new HashMap<>();
  11. for (int i = 1; i <= n; i++)
  12. {
  13. int m = scanner.nextInt();
  14. if (m % k == 0)ans++;
  15. else
  16. {
  17. int p = m % k;
  18. if (M.containsKey(k - p) && M.get(k - p) > 0)
  19. {
  20. ans++;
  21. M.put(k - p, M.get(k - p) - 1);
  22. }
  23. else M.put(m % k, M.getOrDefault(m % k, 0) + 1);
  24. }
  25. }
  26. System.out.println(ans);
  27. }
  28. }

D-游游买商品_牛客周赛 Round 18 (nowcoder.com)

背包问题变形(太久没写,晚上看的时候细节容易写错)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1010;
  4. #define endl '\n'
  5. #define int long long
  6. int a[maxn], b[maxn];
  7. int dp[maxn][maxn];//前i件商品价格为j的最大满足
  8. int n, x;
  9. signed main()
  10. {
  11. cin.tie(0) -> sync_with_stdio(false);
  12. int n, x; cin >> n >> x;
  13. for(int i = 1;i <= n; i++) cin >> a[i];
  14. for(int i = 1;i <= n; i++) cin >> b[i];
  15. for(int i = 1;i <= n; i++)
  16. {
  17. for(int j = 1;j <= x; j++)
  18. {
  19. if(j >= a[i])
  20. dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - a[i]] + b[i]);
  21. else dp[i][j] = dp[i - 1][j];
  22. int t = (a[i] / 2 + a[i - 1]);
  23. if(i > 1 && j >= t)
  24. dp[i][j] = max(dp[i][j], dp[i - 2][j - t] + b[i] + b[i - 1]);
  25. }
  26. }
  27. cout << dp[n][x] << endl;
  28. return 0;
  29. }

Java版

  1. import java.util.*;
  2. public class Main
  3. {
  4. public static void main(String[] args)
  5. {
  6. Scanner scanner = new Scanner(System.in);
  7. int maxn = 1010;
  8. long [][] dp = new long [maxn][maxn];
  9. int n, x;
  10. n = scanner.nextInt();
  11. x = scanner.nextInt();
  12. int[] a = new int[maxn];
  13. int[] b = new int[maxn];
  14. for (int i = 1; i <= n; i++) a[i] = scanner.nextInt();
  15. for (int i = 1; i <= n; i++) b[i] = scanner.nextInt();
  16. for (int i = 1; i <= n; i++)
  17. {
  18. for (int j = 1; j <= x; j++)
  19. {
  20. if (j >= a[i])
  21. dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - a[i]] + b[i]);
  22. else
  23. dp[i][j] = dp[i - 1][j];
  24. int t = (a[i] / 2 + a[i - 1]);
  25. if (i > 1 && j >= t)
  26. dp[i][j] = Math.max(dp[i][j], dp[i - 2][j - t] + b[i] + b[i - 1]);
  27. }
  28. }
  29. System.out.println(dp[n][x]);
  30. }
  31. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号