1. 换座位
题目
代码
#include <bits/stdc++.h>
using namespace std;
int n, m, a;
int main() {
cin >> n >> m >> a;
vector<vector<string>> v(n, vector<string>(m, string()));
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
cin >> v[i][j];
}
}
int count = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
int r = (i == n-1) ? 0 : i + 1;
int c = (j == m-1) ? 0 : j + 1;
for(int k = 0; k < a; k++) {
if(v[i][j][k] != v[r][c][k]) count++;
}
}
}
cout << count << endl;
}
注意点
- 注意下标不要搞错,需要处理边界情况
2. 申请奖学金
题目
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
for(int i = 0; i < t; i++) {
int n, x;
bool flag = false;
double res = 0;
int w = 0;
cin >> n >> x;
vector<int> v1(n, 0);
vector<int> v2(n, 0);
for(int i = 0; i < n; i++) cin >> v1[i];
for(int i = 0; i < n; i++) cin >> v2[i];
for(int j = 0; j < n; j++) {
if(v2[j] < 60) {
flag = true;
break;
}
res += v1[j] * v2[j];
w += v1[j];
}
res = res/w;
if(res < x || flag) cout << "No" << endl;
else cout << "Yes" << endl;
}
}
3. 染色数组
题目
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<uint64_t> nums(n, 0);
for(int i = 0; i < n; i++) cin >> nums[i];
string s;
cin >> s;
uint64_t t1 = 0, t2 = 0;
int mod = static_cast<int>(1e9 + 7);
for(int i = 0; i < n; i++) {
if(s[i] == 'R') {
t1 = (t1 + nums[i]) % mod;
}
else {
t2 = (t2 + nums[i]) % mod;
}
}
cout << (t1 * t2) % mod << endl;
}
本题需要运用乘法分配律来简化求值的过程。其次有几个注意事项:
- 在内存允许的情况下,先无脑用
uint64_t
- 注意科学计数法的写法
1e9+7
- 对于两个大数的乘积的取余数,可直接先在累加的过程中取余数,不影响最后的答案
4. 汽车
题目
代码
#include <bits/stdc++.h>
using namespace std;
struct Idx {
int index;
int v;
};
struct U {
int index;
int p;
int v;
};
bool cmp(Idx a, Idx b) {
return a.v < b.v;
}
bool cmp2(U a, U b) {
return a.index < b.index;
}
int main() {
int n;
cin >> n;
vector<int> pos(n, 0);
vector<Idx> vec(n, Idx());
for(int i = 0; i < n; i++) {
int p, v;
cin >> p >> v;
pos[i] = p;
vec[i].index = i;
vec[i].v = v;
}
sort(pos.begin(), pos.end());
sort(vec.begin(), vec.end(), cmp);
vector<U> ret(n);
for(int i = 0; i < n; i++) {
ret[i].index = vec[i].index;
ret[i].p = pos[i];
ret[i].v = vec[i].v;
}
sort(ret.begin(), ret.end(), cmp2);
for(int i = 0; i < n; i++) {
cout << ret[i].p << " " << ret[i].v << endl;
}
}
先直接对速度和位置进行排序,逐个匹配上,但这样就丢失了原来的位置信息。因为最后是需要按照原先的速度的顺序来输出的。可同时原先的速度的序列号,然后再赋值到同一个数组中,再按照序列号排序即可
最大公约数
题目
代码
#include <iostream>
#include <algorithm>
using namespace std;
int gcd(int a, int b) {
if(b == 0) return a;
return gcd(b, a % b);
}
int main() {
int t;
cin >> t;
for(int i = 0; i < t; i++) {
int a, b, k;
cin >> a >> b >> k;
int maxV = 0;
for(int i = 0; i < k; i++) {
maxV = max(maxV, gcd(a + i, b + k - i));
}
cout << maxV << endl;
}
}
- 快速求两个数的最大公约数的方法:
a, b = b, a % b
- 由于K并不是很大,可以尝试挨个枚举