A
题意:
给你一个数n,输出他的十位数和个位数。
题解:
求个位数可直接对数n%10,得到个位数,然后使n=n/10,再求n%10即可得到十位数。将答案存储时可逆序存储,否则答案会先输出个位数再输出十位数。
代码:
#include<iostream>
#include<vector>
#include<map>
#include<math.h>
#include<algorithm>
using namespace std;
int n;
int a[10];
int main()
{
int t = 2;
cin >> n;
while (t--)
{
a[t] = n % 10;
n = n / 10;
}
for (int i = 0; i < 2; i++)
cout << a[i];
return 0;
}
B
题意:
给你一个数n,共有i行,0≤i≤N−1,每行对应的列数为j,0≤j≤i。
如果i=j或者j=0,a[i][j]=1。
否则a[i][j]=a[i-1][j-1]+a[i-1][j]
输出a。
即输出n阶杨辉三角。
杨辉三角:杨辉三角_百度百科
题解:
数据不大,直接模拟即可。如果i=j或者j=0,a[i][j]=1,否则a[i][j]=a[i-1][j-1]+a[i-1][j]。到最后即为答案。
代码:
#include<iostream>
#include<vector>
#include<map>
#include<math.h>
#include<algorithm>
using namespace std;
int n;
int a[50][50];
int main()
{
cin >> n;
for(int i=0;i<n;i++)
for (int j = 0; j <= i; j++)
{
if (i == j || j == 0)
a[i][j] = 1;
else
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
for (int i = 0; i < n; i++)
for (int j = 0; j <= i; j++)
{
cout << a[i][j] << ' ';
if (j == i)
cout << endl;
}
return 0;
}
C
K Swap |
题意:
给你一串长度为n的序列,你可以交换a[i]与a[i+k]的值,判断是否可以通过若干次操作使序列单调递增。
题解:
本题可以用并查集的思想,将所有能交换位置的值连成一个连通块,即使a[i],a[i+k],连成连通块。
连通块内的数据是可以任意移动的,所以我们将各连通块内的数据从小到大排序,再放回原数组,判断其是否是单调递增的。
代码:
#include<iostream>
#include<vector>
#include<map>
#include<math.h>
#include<algorithm>
using namespace std;
const int N = 2 * 1e5+10;
int n, k;
int a[N], fa[N], vis[N], b[N];
vector<int>res[N], q[N];
int find(int x)
{
if (fa[x] == x)return x;
else return fa[x] = find(fa[x]);
}
void merge(int a,int b)
{
int x = find(a), y = find(b);
if (x != y)
fa[y] = x;
}
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
fa[i] = i;
}
for (int i = 1; i <= n - k; i++)
merge(i, i + k);
int cnt = 0;
for (int i = 1; i <= n; i++) {
int now = find(i);
if (vis[now] == 0) {
++cnt;
vis[now] = cnt;
}
int id = vis[now];
res[id].push_back(a[i]);
q[id].push_back(i);
}
for (int i = 1; i <= cnt; i++) {
sort(res[i].begin(), res[i].end());
sort(q[i].begin(), q[i].end());
int len = res[i].size();
for (int j = 0; j < len; j++) {
b[q[i][j]] = res[i][j];
}
}
int f = 1;
for (int i = 2; i <= n; i++) {
if (b[i] < b[i - 1]) {
f = 0;
break;
}
}
if (f)cout << "Yes";
else cout << "No";
return 0;
}