作者:Carry_Jia | 来源:互联网 | 2024-11-12 11:51
A. 插入K个数
题目描述:给定一个数组,你需要插入 K 个数,使得最终每个数的下标大于等于其值。输出 K 的值。
解题思路:通过模拟的方式,逐个检查每个元素的位置,计算需要插入的元素数量。
#include
#include
using namespace std;
const int N = 110;
int arr[N];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
long long res = 0;
int j = 1;
if (arr[1] != 1) {
res += arr[1] - 1;
j = arr[1];
}
for (int i = 2; i <= n; i++) {
if (arr[i] <= j + 1) {
j++;
} else {
res += arr[i] - j - 1;
j = arr[i];
}
}
cout <
B. 数组分割与异或
题目描述:给定一个数组,通过多次切割将其分成若干个小数组,每个小数组中找到最长上升子序列的个数,然后将这些个数进行异或运算,如果结果为 0 则输出 YES,否则输出 NO。
解题思路:如果数组的大小为偶数,则可以通过适当划分使得异或和为零。对于奇数长度的数组,只要存在两个连续的非严格上升元素,也可以通过划分使其异或和为零。
#include
#include
using namespace std;
const int N = 1e5 + 10;
int arr[N];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
bool flag = false;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
if (i != 1 && arr[i] <= arr[i - 1]) {
flag = true;
}
}
if (n % 2 == 1) {
if (flag) {
cout <<"YES" <
C. 数组删除
题目描述:给定一个数组,如果某个元素可以被其下标加一整除,则可以删除该元素。问是否可以将整个数组清空,如果可以输出 YES,否则输出 NO。
解题思路:每个元素只能在其位置或之前被删除。通过遍历数组,检查每个元素是否满足条件,如果不满足则输出 NO。
#include
#include
using namespace std;
const int N = 1e5 + 10;
int arr[N];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
bool flag = true;
for (int i = 1; i <= n; i++) {
bool can_delete = false;
for (int j = 1; j <= i; j++) {
if (arr[i] >= j && arr[i] % (j + 1) == 0) {
can_delete = true;
break;
}
}
if (!can_delete) {
flag = false;
break;
}
}
if (flag) {
cout <<"YES" <
D. 模数问题
题目描述:给定 X 和 Y,找到一个 N 使得 N % X = Y % N。
解题思路:通过数学推导和模式匹配,找到符合条件的 N。
#include
#include
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int x, y;
cin >> x >> y;
if (x == y) {
cout < y) {
cout <