本套题目出自码蹄集
文章目录
一、MC0201·银河间的数字之战
相关知识点: 语言基础:基本输入输出
在一个遥远的银河,两个星球:A星和B星因为争夺资源而产生了矛盾。这两个星球都有强大的能量,这种能量可以量化为一个整数。A星的能量为整数a,B星的能量为整数b,整数的绝对值不超过10^5。但这两个星球很特别,它们不通过战争解决矛盾,而是通过数字之战。
数字之战的规则非常简单:两个星球直接相互接触,将他们的能量合并,生成一个新的整数,这个新的整数就是他们的合力。但要注意,星球的能量可能是负的!
作为银河的和平使者,你被委派去计算他们的合力是多少,从而为两个星球制定一个和平方案。请你帮助它们计算出合力的数值
格式
输入格式:一行,输入两个整数a,b( |a|, |b| <= 10^5)
表示A星和B星的能量
输出格式:一个整数,表示他们的合力。
样例 1
输入:23 41
输出:64
样例 2
输入:5 -3
输出:2
备注
对于第二个示例:A星的能量为5,B星的能量为-3,两者的合力为2。
#include<stdio.h>
int main()
{
int a,b;
if(-100000<=a && a<=100000 && -100000<=b && b<=100000)
scanf("%d %d",&a, &b);
int result = a + b;
printf("%d\n",result);
return 0;
}
二、MC0202·特殊数字
相关知识点: 语言基础:循环结构
小码哥是一位勇敢的数学冒险家,他正在探索一个神秘的数字迷宫。迷宫中有许多数字,小码哥需要在一个范围里面[n, N]
n(1 <= n <= N) , N(n <= N <= 10000) 中找到全部特殊数字,该数字该数字能同时被2和3整除,并计算全部特殊数字之和。
你能帮他计算范围内的特殊数字之和吗?
格式
输入格式:一行,输入两个数n和N,中间有一个逗号,n(1 <= n <= N) , N(n <= N <= 10000) 表示特定寻找范围。
输出格式:一行整数表示范围内特殊数字之和。
样例 1
输入:12,32
输出:84
样例 2
输入:15,203
输出:3348
备注
样例解释:
对于第一个样例 12,32,[12,32]之间的特殊字数是[‘12’, ‘18’, ‘24’, ‘30’],之和为84。
对于第二个样例 15,203,[15,203]之间的特殊字数是[‘18’, ‘24’,‘30’, ‘36’, ‘42’, ‘48’, ‘54’, ‘60’, ‘66’, ‘72’, ‘78’, ‘84’, ‘90’, ‘96’, ‘102’, ‘108’, ‘114’, ‘120’ , ‘126’, ‘132’, ‘138’, ‘144’, ‘150’, ‘156’, ‘162’, ‘168’, ‘174’, ‘180’, ‘186’, ‘192’, ‘198’],
之和为3348。
#include<stdio.h>
int main()
{
int n,N;
scanf("%d,%d",&n, &N);
int sum = 0;
for(int i=n;i<=N;i++){
if(i%2==0 && i%3==0){
sum+=i;
}
}
printf("%d",sum);
return 0;
}
三、MC0203·小码哥的艰难选择
相关知识点: 语言基础:选择结构
小码哥养了很多花,这些花每天都需要大量的肥料,现在小码哥提供不起这么多肥料了,他决定从所有的花里面挑选一个淘汰,规则如下:
每一个花的初始分数是1000分;
在总共n(1<= n <= 100)个回合里,每一个回合,小码哥会随机给一个花对应的分数(可正可负),需要加在鲜花的当前分数上。
最后谁的分数最少则淘汰谁,如果出现两个分数一样的,则淘汰掉最先获得这个分数的。
格式
输入格式:第一行包含整数n(1<= n <= 100),表示回合数。
第 2 ~ n +1行,按照时间顺序输入 花的名字和得分(空格隔开) 的信息,其中名称是长度为L(1<= L<= 20)的英语小写字母组成的字符串,分数的绝对值不大于 10000。
输出格式:输出被淘汰的花的名字和最终的分数。
样例 1
输入:2
meigui 110
yueji -20
输出:yueji
980
备注
假定每一次分数变化,都会让该朵鲜花得到一个新的分值。
这段代码只有部分AC,欢迎各位大佬前来解惑
#include <stdio.h>
#include <string.h>
#define MAX_FLOWERS 100
#define MAX_NAME_LENGTH 20
#define INIT_SCORE 1000
typedef struct {
char name[MAX_NAME_LENGTH];
int score;
int index;
} Flower;
Flower flowers[MAX_FLOWERS];
int n;
int compare(const void *a, const void *b) {
return strcmp(((Flower *)a)->name, ((Flower *)b)->name);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s %d", flowers[i].name, &flowers[i].score);\
flowers[i].score += INIT_SCORE;
flowers[i].index = i;
}
// 合并相同花名的分数
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (strcmp(flowers[i].name, flowers[j].name) == 0) {
flowers[i].score += flowers[j].score;
flowers[j].score = 0; // 将j的分数设置为0,避免重复计算
}
}
}
// 排序
qsort(flowers, n, sizeof(Flower), compare);
// 找到分数最小的花
int minScore = INIT_SCORE;
int ansIndex = -1;
char ansName[MAX_NAME_LENGTH];
for (int i = 0; i < n; i++) {
if (flowers[i].score > 0 && flowers[i].score < minScore) {
minScore = flowers[i].score;
ansIndex = flowers[i].index;
strcpy(ansName, flowers[i].name);
}
}
printf("%s\n%d", ansName, minScore);
return 0;
}
}
下面是我在讨论区找的代码,可以全部AC
#include <stdio.h>
#include <string.h>
struct hua
{
char name[20];
int fx;
};
int main()
{
int n;
int m = 0; //记录花的种数(m + 1)
int x; //判断该花是否出现过
char INIT_name[20] = {0};
int INIT_fx;
struct hua a[10];
struct hua *p = a;
scanf("%d", &n);
for (int i = 0; i < n; ++i)
{
x = 1;
scanf("%s %d", INIT_name, &INIT_fx);
//记录分数
for (int j = 0; j < m; ++j)
{
if (strcmp(INIT_name, a[j].name) == 0)
{
a[j].fx += INIT_fx;
x = 0;
break;
}
}
if(x)
{
strcpy(a[m].name, INIT_name);
a[m].fx = INIT_fx + 1000;
++m;
}
//每次输入记录最低分数地址,后续出现相同分数地址不变
for (int i = 0; i < m; ++i)
{
if (p->fx > a[i].fx)
p = &a[i];
}
}
printf("%s\n", p->name);
printf("%d\n", p->fx);
return 0;
}
四、MC0204·世界警察
相关知识点: 杂项:双指针
世界警察小码哥来谈判了,恐怖分子在银行挟持了 n 个人质,每个人质都所属一个国家,第 i 个人质所属的国家为 ci ,人质排成了一排,位置都是固定的。经过商讨,恐怖分子允许小码哥可以带走任意一段连续区间内的人质。但是上级要求小码哥,最好每个国家的人质都带回来一个,不希望人质中有重复的国家。请问小码哥最多可以带出来多少人质。
格式
输入格式:第一行一个正整数 n 表示共有
n 个人质
第二行共有 n 个正整数 第 i 个正整数表示第 i 个人质的所属国家 ci
输出格式:一个整数表示小码哥最多可以带出来的人质数。
样例 1
输入:23 41
输出:64
样例 2
输入:5
1 1 2 3 4
输出:4
备注
其中:1 ≤ n ≤ 10^6 0≤ ci ≤ 10^9
摘自讨论区
#include<stdio.h>
#include<string.h>
int main()
{
int i, j, n; // 1 2 3 4 3 5
int flag;
int a[1000000];
int* p1 = &a[0];
int* p2 = p1;
int Max = 0, Max0;
int t1 = 0, t2 = 0;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
while (1)
{
for (i = t1; i < n; i++)
{
flag = -1;
for (j = t2, flag = 1; j < i; j++)
{
if (a[i] == a[j])
{
flag = 0;
break;
}
else if (i == n - 1)
{
flag = 2;
break;
}
}
if (flag == 0 || flag == 2)
{
t1 = i;
p1 = &a[i];
if (flag == 0)
{
Max0 = (int)(p1 - p2);
}
else if (flag == 2)
{
Max0 = (int)(p1 - p2) + 1;
}
if (Max < Max0) Max = Max0;
break;
}
}
if (i == n - 1) break;
for (i = t2; i < n; i++)
{
if (a[i] == *p1)
{
p2 = &a[i + 1];
t2 = i + 1;
Max0 = (int)(p1 - p2) + 1;
if (Max < Max0) Max = Max0;
break;
}
}//1 2 3 4 2 1 5 4 6 3
}
printf("%d", Max);
return 0;
}
五、MC0205·找鸭子
相关知识点: 语言基础:字符串
小码哥在家里养了很多鸭子,过年的时候想在家里把家里年龄最大的鸭子做成除夕夜的一道菜,所以他把鸭子按照年龄标记为大写字母A-Z,A表示年龄最小,Z表示年龄最大,如家里的鸭子标记成了AAAABBCCC表示家里养了9只鸭子,其中年龄为A的鸭子为4只,年龄为B的鸭子有2只,年龄为C的鸭子有3只,年龄为C的鸭子年龄最大,可以作为年夜菜,但是请注意,标记好的鸭子可能会跑掉找不到了,所以可能不是连续的字符串。在n个鸭子中,你能帮他找到年龄最大的鸭子的年龄吗?
格式
输入格式:一行一个长度为n(1<= n <= 100000) 的鸭子年龄字符串,注意不一定是连续的字符串(字母在字母表中相邻为连续的字符串,如ABC算是连续字符串,BAC则不是连续字符串)。
输出格式:一行一个字符表示最大鸭子年龄。
样例 1
输入:GGGAYEYYYYAAAVCVSBZJ
输出:Z
样例 2
输入:JFHEIAIIIFJAFBFBFBFBWUIW
输出:W
备注
样例解释:
对于第一个样例,字符串JFHEIAIIIFJAFBFBFBFBWUIW中最大的字符是W,所以年龄最大的鸭子的年龄是W。
#include<stdio.h>
#include<string.h>
#define MAX_LENGTH 100000
int main()
{
char ducks[MAX_LENGTH + 1];
scanf("%s",ducks);
int length = strlen(ducks);
char maxAge = 'A';
for (int i =0;i<length;i++){
if (ducks[i]>maxAge){
maxAge = ducks[i];
}
}
printf("%c\n",maxAge);
return 0;
}
六、MC0206·小码哥的英语
相关知识点: 语言基础:循环结构
小码哥在做英语单选题的时候突然想到了一个很有意思的问题:单选题的答案都是A或者B,那么很多道题目的答案组成的就是一个A和B组成的字符串。如果两个相邻的题目的答案是相同的,小码哥就可以修改这两个题目的答案,改成都是A、都是B或者一个是A另外一个是B,小码哥把这个定义为一次操作。那么对于任意一个答案字符串,最少需要多少次操作,才能使得它满足:任意相邻的题目的答案都不同。
格式
输入格式:第一行包含一个数字n(1<= n <= 1000),表示字符串的个数;后面的
n 行,每一行表示一个长度为L(1<= L <= 10000) 的,由字符A和B随机组成的字符串。
输出格式:输出有多行,每一行表示对应字符串需要的最少的操作次数T(1<= T <= 10000)
样例 1
输入:2
AAABAB
AABBBAB
输出:1
2
#include <stdio.h>
#define N 510
int main() {
int n, m;
int a[N] = {0};
scanf("%d %d", &n, &m);
while (m--) {
int x, y;
scanf("%d %d", &x, &y);
a[x]++;
a[y]++;
}
if (a[n] < 1) { // 先判断要送达的点是否大于1
printf("No\n");
return 0;
}
for (int i = 2; i <= 500; i++)
// 这里最重要 你需要判断i是 1到n的范围并且这个范围内的点要大于2
if (i > 1 && i < n && a[i] < 2) {
printf("No\n");
return 0;
}
printf("Yes\n");
return 0;
}
七、MC0207·中转站
本题相关知识点: 搜索:DFS
物流业为了降低物流成本,提高物流效率,运输过程中通常不会由始发地直达目的地,而是经由多个中转站中转,最终到达目的地。最常见的便是快递业,由于中转站有很多,要想将所有中转站两两互通代价过高,因此每个中转站只会与个别中转站单向或双向连通。
在接受订单时,为了判断该物件能否送达,会先查询本站是否能直接送达目的地站点;若不能,则递归查询本站可达中转站,以及中转站的中转站能否送达,直至找出目的地或找遍全部中转站。
小码哥去快递点实习的第一天就遇到了问题,系统因不明原因无法正常判断物件能否送达,好在整个物流网的中转站信息均可访问,小码哥便决定自己设计一个程序临时急用。
格式
输入格式:
第一行输入两个正整数n,m,n 是整个物流网所有中转站的数目,小码哥所在的站点是 1 号,目的地的站点是 n 号;接下来的 m 行,每行输入两个正整数x,y,代表中转站 ,x 可以送往中转站 y。
输出格式:如果物件能够送达,输出”Yes”,否则输出”No”。
样例 1
输入:5 5
1 3
2 3
3 4
2 4
4 5
输出:Yes
样例 2
输入:4 3
1 2
2 3
4 1
输出:No
备注
其中:1<= n <= 500 , 1<= m <= 20000 , 1<= x , y<= n
#include <stdio.h>
#include <string.h>
// 只有ABABABA 和BABABAB两种排序结果,找出他们两个相邻字母相同的数量,再进行比较即可得到最优排序
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) { //输入两次,就循环两次,输入了随便就判断
char s[10001]; // 假设字符串长度不会超过10000(加上一个额外的位置给空字符'\0')
scanf("%s", s);
int len = strlen(s);
int ans1 = 0, ans2 = 0;
for (int j = 0; j < len; j++) {
// ABABABA 奇数为A,偶数为B
if ((j % 2 == 0 && s[j] != 'A') || (j % 2 == 1 && s[j] != 'B')) {
ans1++;
}
// BABABAB 奇数为B,偶数为A
if ((j % 2 == 0 && s[j] != 'B') || (j % 2 == 1 && s[j] != 'A')) {
ans2++;
}
}
// 条件表达式
printf("%d\n", (ans1 < ans2) ? ans1 : ans2);
}
return 0;
}