第一题:排列字母
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要把一个字符串中的字母按其在字母表中的顺序排列。
例如,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 个整数 N、M 和 K 。
以下 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;
}