蓝桥杯刷题第十八天

第一题:排列字母

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

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

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
  vector<char> c;

  string str = "WHERETHEREISAWILLTHEREISAWAY";

  for(auto x : str)
    c.push_back(x);

  sort(c.begin(), c.end());

  for(auto x : c)
    cout<<x;

  return 0;
}

第二题: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

#include<iostream>
using namespace std;

typedef long long LL;
LL a, b;

int main(){
  cin>>a>>b;

  LL m = abs(a - b);
  LL d = a % m;
  LL k;
  k = (d == 0 ? 0 : m - d);
  
  cout<<k<<endl;
  return 0;
}
#include<iostream>
using namespace std;

typedef long long LL;

int main(){
  LL a, b;
  cin>>a>>b;

  LL x = abs(a - b);
  cout<<x - a%x;

  return 0;
}

第三题:选数异或

第四题:背包与魔法

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

01背包变种问题

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

然后每次取最大值即可

#include<iostream>
using namespace std;

const int N = 2010, M = 10010;
int f[2][M];
int w[N], v[N];
int n, m, k;

int main(){
  scanf("%d%d%d", &n, &m, &k);

  for(int i = 1; i <= n; i++) scanf("%d%d", &w[i], &v[i]);

  for(int i = 1; i <= n; i++){
    for(int j = m; j >= w[i]; j--){
      f[0][j] = max(f[0][j], f[0][j-w[i]] + v[i]);
      if(j >= k + w[i])
        f[1][j] = max(max(f[1][j], f[1][j-w[i]] + v[i]) , f[0][j-w[i]-k] + v[i] * 2);
    }
  }

  cout<<max(f[0][m], f[1][m])<<endl;
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
11
02-01 220
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Libert_AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值