题解!

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;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务