题解!
A 子兰学C语言
题意
输出字符串 printf("%d",x);
思路
% 后跟的是数据类型如果加的字符不能识别则不会显示 " 会出现和输出的"相冲突的情况,所以要输出为" 推荐阅读文章 知乎文章
代码
#include <stdio.h>
int main()
{
printf("printf(\"%%d\",x);");
return 0;
}
B 期末考试启动
前置知识: 动态规划(DP)
题意
给你一个由小写字母组成的字符串 ,问这个字符串中子序列 的数量。
思路
1. DP数组定义
表示在字符串 中考虑到当前位置时,子序列 的前 个字符的出现次数。
这里 i 的取值范围是 1 到 4,分别对应 中的每个字符。
例如:遍历到当前字符是 时 代表目前子序列 出现的次数。
2. 状态转移
- 当我们遇到字符 时,它可以作为子序列 中的 ,因此 自增。
- 当我们遇到字符 时,之前出现的每个 都可以与这个 组合形成 序列,因此 加上当前的 值。
- 当我们遇到字符 时,同理,每个 序列都可以与这个 组合,所以 加上当前的 。
- 当我们遇到字符 时,每个 都可以与这个 组合,因此 加上当前的 。
3. 求解答案
最终, 就是整个字符串中 子序列的总数。
代码
#include<stdio.h>
long long cnt[5];
int main()
{
char s[50005];
scanf("%s",s);
memset(cnt,0,sizeof(cnt));
for(int i=0;s[i];i++)
if(s[i]=='y')
cnt[1]++;
else if(s[i]=='s')
cnt[2]+=cnt[1];
else if(s[i]=='q')
cnt[3]+=cnt[2];
else if(s[i]=='d')
cnt[4]+=cnt[3];
printf("%lld",cnt[4]);
return 0;
}
C 心烦的小张
题意
统计从 到 的数字中,有多少个数字的个位数是 或者 。
思路
数据范围较大,如果直接遍历,必定超时,但观察到,每十个数之间必定存在 和 出现在个位数各一次。 所以得到将提供的n直接除以10乘以2然后将原数字的个位数与4和7比较大小即可得到输出的答案。
#include <stdio.h>
int main()
{
long long n;
scanf("%lld", &n);
long long x = n % 10, sum = n / 10 * 2;
if (x >= 7)
sum ++;
if (x >= 4)
sum ++;
printf("%lld", sum);
}
D 晓芳的期末复习
题意
给定n门学科的考试时间和名称,按照日期和名称的顺序排好复习的学科顺序。
思路
直接按照题意比较即可: 先比较日期大小,按照从小到大的顺序排列 当日期时间相同时利用strcmp函数的返回值来进行字典序排序
代码
#include <stdio.h>
#include <string.h>
#define ll long long
#define N 3005
struct node
{
int data;
char s[6];
} a[N];
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%s%d", a[i].s, &a[i].data);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n - i; j++)
{
if (a[j].data > a[j + 1].data ||
(a[j].data == a[j + 1].data && strcmp(a[j].s, a[j + 1].s) > 0))
{
// Swap elements directly
struct node temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 1; i <= n; i++)
printf("%s\n", a[i].s);
return 0;
}
E 大涛的想出题
题意
给定一个包含 n 个数字的序列,每个数字只能是 0 或 1。要计算每100个数字中最长的连续 1 的子串的长度,并将得到的长度存入一个数组b中。请找出数组b中最大的数字是多少。
思路
遍历整个序列时,每次取100个数字进行处理。在这100个数字中,我会找出最长的连续1的子串的长度,并将其存入数组b中。最后,我会找出数组b中最大的数字,即为所求的结果。
代码
#include <stdio.h>
#define N 500100
int s[N] = {0};
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &s[i]);
}
int mx = 0, mx2 = 0, sum = 0;
int j = 0;
for (int i = 0; i < n; i += j)
{
sum = 0;
mx2 = 0;
for (j = 0; j < 100 && i + j < n; j++) {
if (s[i + j] == 1)
{
mx2++;
sum = (mx2 > sum) ? mx2 : sum;//三元运算符同学们应该都认识吧
}
else
{
mx2 = 0;
}
}
mx = (sum > mx) ? sum : mx;
}
mx = (sum > mx) ? sum : mx;
printf("%d", mx);
return 0;
}
F 成绩小侦探团
题意
求出有多少个同学的成绩大于等于班级平均成绩。
思路
先求出班级平均成绩,再通过平均成绩判断每个同学是否满足题目要求,如果满足,答案+1。
代码
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double a[500005],average=0;
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
average=average+a[i];
}
average=average/n;
int ans=0;
for(int i=0;i<n;i++)
{
if(a[i]>=average)
ans++;
}
printf("%d",ans);
return 0;
}