当前位置:   article > 正文

蓝桥杯刷题第十八天_只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小蓝要为一条街的住

只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小蓝要为一条街的住

第一题:排列字母

问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要把一个字符串中的字母按其在字母表中的顺序排列。
例如,LANQIAO 排列后为 AAILNOQ。
又如,GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPSTUUYYY。
请问对于以下字符串,排列之后字符串是什么?
WHERETHEREISAWILLTHEREISAWAY
运行限制
最大运行时间:1s
最大运行内存: 512M

放进vector里面排序,直接排序也可以

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. int main(){
  6. vector<char> c;
  7. string str = "WHERETHEREISAWILLTHEREISAWAY";
  8. for(auto x : str)
  9. c.push_back(x);
  10. sort(c.begin(), c.end());
  11. for(auto x : c)
  12. cout<<x;
  13. return 0;
  14. }

第二题:GCD

问题描述
给定两个不同的正整数 a, b, 求一个正整数 kk 使得 gcd(a+k,b+k) 尽可能 大, 其中 gcd(a,b) 表示 a 和 b的最大公约数, 如果存在多个 k, 请输出所有满 足条件的 k 中最小的那个。
输入格式
输入一行包含两个正整数 a,b, 用一个空格分隔。
输出格式
输出一行包含一个正整数 k

样例输入

5 7

样例输出

1

gcd(a, b) = gcd(a, a -b)

加k gcd (a +k, b + k) = gcd(a + k, a - b)

令 c = a - b,-〉gcd(a + k, c)

最大值一定为c, 只要找a 要多少倍得到c

  1. #include<iostream>
  2. using namespace std;
  3. typedef long long LL;
  4. LL a, b;
  5. int main(){
  6. cin>>a>>b;
  7. LL m = abs(a - b);
  8. LL d = a % m;
  9. LL k;
  10. k = (d == 0 ? 0 : m - d);
  11. cout<<k<<endl;
  12. return 0;
  13. }
  1. #include<iostream>
  2. using namespace std;
  3. typedef long long LL;
  4. int main(){
  5. LL a, b;
  6. cin>>a>>b;
  7. LL x = abs(a - b);
  8. cout<<x - a%x;
  9. return 0;
  10. }

第三题:选数异或

第四题:背包与魔法

问题描述
小蓝面前有 N 件物品, 其中第 i 件重量是 W i , 价值是 V i 。她还有一个背包, 最大承重是 M
小蓝想知道在背包称重范围内, 她最多能装总价值多少的物品?
特别值得一提的是, 小蓝可以使用一个魔法 (总共使用一次), 将一件物品 的重量增加 K, 同时价值秝倍。(当然小蓝也可以不使用魔法)
输入格式
第一行包含 3 个整数 NMK
以下 N 行, 每行两个整数 W i V i
输出格式
一个整数代表答案。

01背包变种问题

分开考虑使用魔法与否,0表示不使用或者使用一次结束了,1表示未使用

然后每次取最大值即可

  1. #include<iostream>
  2. using namespace std;
  3. const int N = 2010, M = 10010;
  4. int f[2][M];
  5. int w[N], v[N];
  6. int n, m, k;
  7. int main(){
  8. scanf("%d%d%d", &n, &m, &k);
  9. for(int i = 1; i <= n; i++) scanf("%d%d", &w[i], &v[i]);
  10. for(int i = 1; i <= n; i++){
  11. for(int j = m; j >= w[i]; j--){
  12. f[0][j] = max(f[0][j], f[0][j-w[i]] + v[i]);
  13. if(j >= k + w[i])
  14. f[1][j] = max(max(f[1][j], f[1][j-w[i]] + v[i]) , f[0][j-w[i]-k] + v[i] * 2);
  15. }
  16. }
  17. cout<<max(f[0][m], f[1][m])<<endl;
  18. return 0;
  19. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/794795
推荐阅读
相关标签
  

闽ICP备14008679号