第1题:找和为K的两个元素
在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k。
输入
第一行输入序列的长度n和k,用空格分开。 第二行输入序列中的n个整数,用空格分开。
输出
如果存在某两个元素的和为k,则输出yes,否则输出no。
样例输入
9 10
1 2 3 4 5 6 7 8 9
样例输出
yes
下面是解决该问题的C语言代码示例:
#include <stdio.h>
int checkSum(int arr[], int n, int k) {
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (arr[i] + arr[j] == k) {
return 1; // 找到两个元素之和等于k,返回1
}
}
}
return 0; // 没有找到两个元素之和等于k,返回0
}
int main() {
int n, k;
scanf("%d %d", &n, &k); // 输入序列长度n和目标和k
int arr[1000];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]); // 输入整数序列
}
int result = checkSum(arr, n, k); // 检查是否存在和为k的两个元素
if (result == 1) {
printf("yes\n"); // 输出yes
} else {
printf("no\n"); // 输出no
}
return 0;
}
解题思路:
(1)读取输入:首先,从标准输入读取序列的长度n和目标和k。然后,使用一个数组存储这个序列的元素。
(2)检查和:使用两层嵌套循环遍历序列中所有可能的元素组合。对于每一对元素,检查它们的和是否等于目标和k。如果找到了和为k的两个元素,则返回1。
(3)输出结果:根据返回值判断是否存在和为k的两个元素。如果返回值为1,则输出"yes";如果返回值为0,则输出"no"。
通过以上步骤,我们可以判断一个序列中是否存在某两个元素之和为k,并按要求的格式输出结果。
第2题:硬币面值组合
使用1角、2角、5角硬币组成 n 角钱。 设1角、2角、5角的硬币各用了a、b、c个,列出所有可能的a, b, c组合。 输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大。
输入
一个整数n(1 <= n <= 100),代表需要组成的钱的角数。
输出
输出有若干行,每行的形式为: i a b c 第1列i代表当前行数(行数从001开始,固定3个字符宽度,宽度不足3的用0填充),后面3列a, b, c分别代表1角、2角、5角硬币的个数(每个数字固定12个字符宽度,宽度不足的在左边填充空格)。
样例输入
10
样例输出
001 10 0 0
002 8 1 0
003 6 2 0
004 4 3 0
005 2 4 0
006 0 5 0
007 5 0 1
008 3 1 1
009 1 2 1
010 0 0 2
下面是解决该问题的C语言代码示例:
#include <stdio.h>
void printCombination(int n) {
int count = 0; // 行数计数器
for (int c = 0; c <= n / 5; c++) {
for (int b = 0; b <= n / 2; b++) {
int a = n - 5 * c - 2 * b; // 计算1角硬币个数
if (a >= 0) {
count++;
printf("%03d %12d %12d %12d\n", count, a, b, c);
}
}
}
}
int main() {
int n;
scanf("%d", &n); // 输入需要组成的钱的角数
printCombination(n); // 输出硬币面值组合
return 0;
}
解题思路:
(1)读取输入:从标准输入读取需要组成的钱的角数n。
(2)硬币面值组合:使用两层嵌套循环,其中外层循环变量c表示5角硬币的个数,在0到n/5的范围内遍历。内层循环变量b表示2角硬币的个数,在0到n/2的范围内遍历。计算1角硬币的个数a,通过n减去已经使用的5角和2角硬币数量。检查a是否大于等于0,如果是,则说明这个组合是有效的。
(3)输出结果:对于每个有效的组合,使用计数器count记录行数,并按要求的格式输出行数、1角、2角和5角硬币的个数。
通过以上步骤,我们可以列出所有可能的硬币面值组合,并按要求的格式输出结果。
第3题:分解因数
给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * … * an,并且1 < a1 <= a2 <= a3 <= … <= an,问这样的分解的种数有多少。注意到a = a也是一种分解。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (1 < a < 32768)
输出
n行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数
样例输入
2
2
20
样例输出
1
4
下面是解决该问题的C语言代码示例:
#include <stdio.h>
int factorize(int n) {
int count = 0; // 分解的种数计数器
// 在范围 1 到 n/2 内遍历可能的因子
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
count++;
}
}
count++; // 加上自身为因子的情况
return count;
}
int main() {
int n;
scanf("%d", &n); // 输入测试数据的组数
for (int i = 0; i < n; i++) {
int a;
scanf("%d", &a); // 输入正整数a
int result = factorize(a); // 分解的种数
printf("%d\n", result); // 输出结果
}
return 0;
}
解题思路:
(1)读取输入:首先,从标准输入读取测试数据的组数n。然后,使用一个循环读取每组测试数据,即正整数a。
(2)分解因数:使用循环从1到n/2的范围内遍历可能的因子,对于每个因子i,检查a是否可以被i整除。如果可以整除,则将分解的种数计数器count加1。
(3)输出结果:对于每组测试数据,输出分解的种数。
通过以上步骤,我们可以计算出给定正整数的分解种数,并按要求的格式输出结果。
第4题:苹果消消乐
有100个苹果和香蕉排成一条直线,其中有N个香蕉,你可以使用至多M次魔法道具将香蕉变成苹果,最后“最长的连续苹果数量”即为你本次苹果消消乐的得分,给定苹果和香蕉的排列,求你能获得的最大得分。
提示:这是个枚举题
输入
第一行是一个整数T(1 <= T <= 10),代表测试数据的组数。 每个测试数据第一行是2个整数N和M(0 <= N, M <= 100)。第二行包含N个整数a1, a2, … aN(1 <= a1 < a2 < … < aN <= 100),表示第a1, a2, … aN个位置上摆放的是香蕉。
输出
对于每组数据,输出通过使用魔法道具后你能获得的最大得分。
样例输入
3
5 1
34 77 82 83 84
5 2
10 30 55 56 90
5 10
10 30 55 56 90
样例输出
76
59
100
下面是解决该问题的C语言代码示例:
#include <stdio.h>
int getMaxScore(int apples[], int n, int m) {
int maxScore = 0; // 最大得分
// 枚举每个位置
for (int i = 0; i < n; i++) {
int score = 0; // 当前位置的得分
// 使用魔法道具将香蕉变成苹果
for (int j = i; j < n; j++) {
if (apples[j] == 0 && m > 0) {
m--;
score++;
} else if (apples[j] == 1) {
score++;
} else {
break; // 遇到苹果跳出循环
}
}
// 更新最大得分
if (score > maxScore) {
maxScore = score;
}
}
return maxScore;
}
int main() {
int T;
scanf("%d", &T); // 输入测试数据的组数
for (int i = 0; i < T; i++) {
int N, M;
scanf("%d %d", &N, &M); // 输入香蕉数量和魔法道具次数
int apples[100] = {0}; // 初始化苹果和香蕉排列
for (int j = 0; j < N; j++) {
int position;
scanf("%d", &position); // 输入香蕉位置
apples[position - 1] = 1; // 标记该位置为香蕉
}
int result = getMaxScore(apples, 100, M); // 获取最大得分
printf("%d\n", result); // 输出结果
}
return 0;
}
解题思路:
(1)读取输入:首先,从标准输入读取测试数据的组数T。然后,使用一个循环读取每组测试数据,即香蕉数量N和魔法道具次数M。接下来,读取N个整数,表示香蕉的位置。
(2)获取最大得分:对于每组测试数据,使用两层循环枚举每个位置,从当前位置开始使用魔法道具将香蕉变成苹果,直到遇到苹果或者魔法道具次数用完为止。在每个位置处,记录得分,并更新最大得分。
(3)输出结果:对于每组测试数据,输出最大得分。
通过以上步骤,我们可以计算出使用魔法道具后能获得的最大得分,并按要求的格式输出结果。
第5题:数列
用以下方式构造数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求数列中第a个数对1000取模的结果是多少。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。
输出
n行,每行输出对应一个输入。输出应是一个正整数,为数列中第a个数对1000取模得到的结果。
样例输入
4
5
2
19
1
样例输出
5
1
181
1
下面是解决该问题的C语言代码示例:
#include <stdio.h>
int getModulo(int a) {
int first = 1; // 数列的第一个数
int second = 1; // 数列的第二个数
int result = 0; // 数列中第a个数对1000取模的结果
if (a == 1 || a == 2) {
return 1; // 数列的前两个数都为1
}
// 计算数列中第a个数
for (int i = 3; i <= a; i++) {
result = (first + second) % 1000; // 取模操作
first = second;
second = result;
}
return result;
}
int main() {
int n;
scanf("%d", &n); // 输入测试数据的组数
for (int i = 0; i < n; i++) {
int a;
scanf("%d", &a); // 输入正整数a
int result = getModulo(a); // 计算数列中第a个数对1000取模的结果
printf("%d\n", result); // 输出结果
}
return 0;
}
解题思路:
(1)读取输入:首先,从标准输入读取测试数据的组数n。然后,使用一个循环读取每组测试数据,即正整数a。
(2)计算数列中第a个数:使用循环从第3个数开始计算数列中的数,每个数都等于前面两个数之和。使用两个变量first
和second
分别表示数列的前两个数,通过迭代更新这两个数,并计算出数列中第a个数对1000取模的结果。
(3)输出结果:对于每组测试数据,输出数列中第a个数对1000取模的结果。
通过以上步骤,我们可以计算出数列中第a个数对1000取模的结果,并按要求的格式输出结果。