A - Last Two Digits
题意:给定一个整数,输出数的最后两位
思路:直接输出字符串的倒数第2和倒数第三位即可,因为字符串从0开始存储
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e3+5, MOD = 998244353;
string s;
int main()
{
cin >> s;
int n = s.size();
cout << s[n - 2] << s[n - 1];
return 0;
}
B - Practical Computing
题意:
思路:不难发现这是一道输出n阶的杨辉三角的题目,里面的数字满足这层关系 arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 35;
int arr[N][N];
int n;
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
arr[i][0] = 1;
arr[i][i] = 1;
}
for (int i = 2; i < n; i++)
{
for (int j = 1; j < i; j++)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
C - K Swap
题意:给定长度为N的数组,可整数K,你可以进行0次或者多次以下的操作:选择一个整数i ,然后 a[ i ]和 a [i + k] 进行交换,问最终能否得到非严格递增的数组。如果可以输出Yes,否则No。
思路:将1,1+K,1+K+K…,2,2+K,2+K+K…看成一个个连通块,在这些连通块中,最末的下标的一定能交换成最大的数,将数的下标记录下来,然后每个连通块按从小到大排好序后,再将其值放回去。看最终能都非严格单调递增。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 1;
const int MOD = 1e9 + 7;
int n, k;
int main()
{
cin >> n >> k;
vector<int> a(n);
vector<vector<int>> b(k); // 二维数组存放数字
for (int i = 0; i < n; i ++)
{
cin >> a[i];
b[i % k].push_back(a[i]);
}
// 对每一组数据进行降序排序
for (int i = 0; i < k; i++)
{
sort(b[i].rbegin(), b[i].rend());
}
sort(a.begin(), a.end());
vector<int> res; // 存放结果
for (int i = 0; i < n; i ++)
{
res.push_back(b[i % k].back());
b[i % k].pop_back();
}
if (a == res) printf("Yes");
else printf("No");
return 0;
}