第四届新生程序设计竞赛正式赛(C语言)

A: HNUCM的学习达人

SQ同学是HNUCM的学习达人,据说他每七天就能够看完一本书,每天看七分之一本书,而且他喜欢看完一本书之后再看另外一本。

现在请你编写一个程序,统计在指定天数中,SQ同学看完了多少本完整的书(假定第1本书从第1天开始看)?

输入

单组输入。

输入一个不超过365的正整数N表示天数。

输出

输出在这N天中,SQ同学已全部看完的书的数量。

样例输入 Copy
复制代码
20
样例输出 Copy
复制代码
2
#include<stdio.h>
int main()
{
    int a;
    scanf("%d",&a);
    printf("%d\n",a/7);
    return 0;
}

B: HNUCM的宿舍安排

HNUCM的宿舍安排有点意思,男生都是5人间,女生都是4人间。

现在已知N个学生的性别,男生和女生的性别分别用'M'和'F'表示。

请你编写一个程序计算最少需要多少间男生宿舍?多少间女生宿舍?(注:不要求每一间宿舍都住满)。

输入

单组输入。

输入一行包含N个'M'和'F'的字符串,N<=1000,'M'表示男生,'F'表示女生。

输出

输出两个整数,分别表示最少需要的男生宿舍和女生宿舍数量,两者之间用英文空格隔开。

样例输入 Copy
复制代码
MMFFMMFFMFMMM
样例输出 Copy
复制代码
2 2
#include<stdio.h>
int main()
{
    int i,b=0,c=0,d=0,e=0,f=0;
    char a[1001]={0};
    scanf("%s",a);
    for(i=0;i<1001;i++)
    {
        if(a[i]=='M')
            c++;
        if(a[i]=='F')
            d++;
    }
    if(c%5==0)
        printf("%d ",c/5);
    else
        printf("%d ",c/5+1);
    if(d%4==0)
        printf("%d\n",d/4);
    else
        printf("%d\n",d/4+1);
    return 0;
}

C: HNUCM的社团招新

又有一波萌新来到了HNUCM,各个社团开始了忙碌的招新工作。

某社团在招新面试时设置了三个评价指标,每一个指标的得分都是1-10之间的正整数。

该社团的录取规则包含以下两条:

(1) 如果三个指标的得分都大于等于6分可录取;

(2) 如果有一个指标的得分等于10,无论另外两个指标得分为多少,可以破格录取。

现在给出n个新生的指标得分数值(N<=1000),请编写一个程序统计最终被录取的人数。

输入

单组输入。

第一行输入一个正整数n,表示前来面试的新生人数。

接下来n行,每一行输入三个1-10之间的正整数表示某一位同学三个指标的得分,可以包含1和10,两两之间用英文空格隔开。

输出

输出最终被录取的人数。

样例输入 Copy
复制代码
5
5 6 7
6 6 6
6 8 4
6 7 8
5 10 5
样例输出 Copy
复制代码
3
#include<stdio.h>
int main()
{
    int a,b,c,d,e=0;
    scanf("%d",&a);
    while(a--)
    {
        scanf("%d %d %d",&b,&c,&d);
        if(b>=6&&c>=6&&d>=6)
            e++;
        else
            if(b==10||c==10||d==10)
                e++;
    }
    printf("%d\n",e);
    return 0;
}

D: HNUCM的团队跑步

HNUCM运动会增加了一个团队跑步的项目,该项目的规则如下:

(1) 每个团队只能包含四名队员,每名队员从起点跑到终点的时间不一定相同;

(2) 每次最多允许两名队员一起从起点跑到终点,且两名队员一起跑到终点所需时间以最后到达的那名队员所需时间计算;

(3) 每次队员从起点到终点都需要携带一个团队徽章,每个队只有一个团队徽章,这意味着如果徽章在终点的话需要有队员把徽章从终点送回起点,否则起点的队员就会因为没有徽章而不能出发。

现在告诉你一个团队四名队员独自从起点跑到终点所需时间(单位:分钟),你能否编写一个程序,计算该团队四名成员全部从起点到达终点所需最少时间(单位:分钟)。

输入

单组输入。

输入四个正整数a, b, c, d,分别表示四名队员独自跑到终点所需时间(单位:分钟),两两之间用英文空格隔开。

输出

输出该团队四名成员全部达到终点所需最少时间(单位:分钟)。

样例输入 Copy
复制代码
1 2 3 4
样例输出 Copy
复制代码
11
#include<stdio.h>
int main()
{
    int a[4],i,j,t,f,g;
    for(i=0;i<4;i++)
        scanf("%d",&a[i]);
    for(j=0;j<3;j++)
        for(i=0;i<3-j;i++)
        if(a[i]>a[i+1])
        {
            t=a[i];
            a[i]=a[i+1];
            a[i+1]=t;
        }
        f=a[3]+a[2]+a[1]+2*a[0];
        g=a[0]+a[3]+3*a[1];
        if(f<g)
            printf("%d\n",f);
        else
            printf("%d\n",g);
    return 0;
}

E: HNUCM的连续子串

HNUCM是一所美丽的大学,这里有美丽的景、美丽的人,也经常会发生一些美丽的事。

现在给你一个全部由大写字母组成的字符串,在删除若干字符后,请问其中最多可以包含多少个独立的"HNUCM"子字符串?

【"HNUCM"必须连续出现。】

输入

多组输入。

每组1行,输入一个长度不超过10000,且只包含大写字母的字符串。

输出

在对输入字符串进行删除操作后所包含的独立连续"HNUCM"子字符串的最大数量,如果一个都没有则输出0。

样例输入 Copy
复制代码
ABCDE
HHNUCMM
HHNNUUCCMM
HBNCUDCMAAAHBBNCCUDCEM
样例输出 Copy
复制代码
0
1
1
2
#include <stdio.h>
#include <string.h>
char a[10000];
char b[] = "HNUCM";
int main() 
{
    while (~scanf("%s", a))
    {
        int i = 0, j = 0;
        int len = strlen(a);
        for (int k = 0; k < len; k++) 
        {
            if (a[k] == b[i]) 
                i++;
            if (i == 5) 
            {
                i = 0;
                j++;
            }
        }
        printf("%d\n", j);
    }
    return 0;
}

F: HNUCM的学生食堂

HNUCM的学生食堂物美价廉,深受同学们的喜爱。

HNUCM学生食堂的饭是不用付钱的,而且还可以加饭,想加多少都可以,管饱,真好。当然菜还是得花钱买的。

假设HNUCM食堂一共有m种菜品,其中价格为1元每份的菜有m1种,价格为2元每份的菜有m2种,价格为3元每份的菜有m3种,m = m1 + m2 + m3,m1、m2和m3均大于等于2且小于等于10。

节俭的Kimi同学打了若干种菜,总价正好10元,当然每一种菜最多只打一份。

现在告诉你m1、m2和m3,请问Kimi可以得到多少种不同的菜品的组合?

输入

输入一行包含三个正整数,分别对应m1、m2和m3,两两之间用一个英文空格隔开,且m1、m2和m3均为2到10之间的正整数。

输出

输出Kimi可以得到的菜品组合数。

样例输入 Copy
复制代码
2 2 2
样例输出 Copy
复制代码
3
提示

提示:

10 = 1 + 1 + 2 + 3 + 3 (有两种组合)

10 = 2 + 2 + 3 + 3 (一种组合)

#include <stdio.h>
int fun(int m, int n) {
    int a = 1;
    for (int i = 1; i <= m; i++) {
        a = a * (n - m + i) / i;
    }
    return a;
}
void solve() {
    int m1, m2, m3, s = 0;
    scanf("%d%d%d", &m1, &m2, &m3);
    for (int i = 0; i <= m1; i++) {
        for (int j = 0; j <= m2; j++) {
            for (int k = 0; k <= m3; k++) {
                if (i + 2 * j + 3 * k == 10) {
                    s += fun(i, m1) * fun(j, m2) * fun(k, m3);
                }
            }
        }
    }
    printf("%d\n", s);
}
int main() {
    solve();
    return 0;
}

G: HNUCM的美味外卖

作为队伍的核心,lsx很受另外两个队友的尊敬。

biscuit每天都要请lsx学长吃外卖,但很不幸的是lsx所在的HNUCM学校周围只有3家lsx爱吃的外卖。

如果biscuit给lsx买了别家的外卖,lsx就会大喊"我不吃我不吃"。

但是lsx又不喜欢连续三天吃一种外卖。

如果biscuit哪天忘了这件事并且三天给他买了同一家外卖,那么lsx就会把biscuit的头摁进手机屏幕里。

作为biscuit的好朋友,你能告诉他连续请lsx吃n天饭,有多少不同的购买方法吗?

输入

多组样例。

第一行一个整数T(1<=T<=20)代表测试样例数;

接下来T行每行一个整数n,代表biscuit要请lsx吃n天饭(1<=n<=100000)

输出

输出T个整数表示方案数,答案可能很大输出对 1e9+7 取模的结果。

样例输入 Copy
复制代码
2
1
2
样例输出 Copy
复制代码
3
9
#include <stdio.h>
#define N 100005
#define M 1000000007
long long a[N] = {1, 3};
void solve() {
    for (int i = 2; i < N; i++) {
        a[i] = (a[i - 1] + a[i - 2]) * 2 % M;
    }
    int t;
    scanf("%d", &t);
    while (t--) {
        int n;
        scanf("%d", &n);
        printf("%lld\n", a[n - 1] * 3 % M);
    }
}
int main() {
    solve();
    return 0;
}

H: HNUCM的孤独数字

HNUCM的SQ同学随手写了一个只包含'0'和'1'这两种数字的数组。

他发现在这个数组中,可能会存在一个'0'的周围八个方向(上、下、左、右、左上、右上、左下、右下)全部都是'1',也可能存在一个'1'的周围八个方向全部都是'0',他将满足该要求的数字称为"孤独数字"。当然如果一个位于边缘的数字'0'的周围能够出现数字的地方都是'1',或者一个'1'的周围能够出现数字的地方都是'0',它也是一个"孤独数字"。

现在输入一个只包含'0'和'1'的数组,请编写一个程序统计其中包含的"孤独数字"的个数。

输入

单组输入。

第1行输入两个正整数m和n,分别表示输入数组的行数和列数,m和n均不超过1000,两者之间用英文空格隔开。

接下来m行,每行包含一个由n个'0'和'1'组成的字符串。

输出

输出在该数组中包含的"孤独数字"的个数。

样例输入 Copy
复制代码
5 5
01110
01010
01110
00001
10000
样例输出 Copy
复制代码
2
#include <stdio.h>
#define N 1005
char a[N][N];
int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
void solve() {
    int m, n;
    scanf("%d %d", &m, &n);
    int s = 0;
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            scanf(" %c", &a[i][j]);
        }
    }
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            int t = 0;
            for (int k = 0; k < 8; k++) {
                int x = i + dx[k], y = j + dy[k];
                if (x >= 1 && x <= m && y >= 1 && y <= n) {
                    if (a[x][y] == a[i][j]) {
                        t = 1;
                        break;
                    }
                }
            }
            if (t == 0) {
                s++;
            }
        }
    }
    printf("%d\n",s);
}
int main() {
    solve();
    return 0;
}

I: HNUCM的十佳歌手

一年一度的HNUCM十佳歌手大赛正在如火如荼举行中,今年参赛选手人数创历史新高,评委阵容也非常强大。

今年的评委一共有20名,其中10名专业评委,10名学生评委。

对于专业评委组,在计算小组得分的时候将去掉一个最高分和一个最低分,然后取平均分,该组平均分占最后总成绩的60%。

对于学生评委组,在计算小组得分的时候也将去掉一个最高分和一个最低分,然后取平均分,该组平均分占最后总成绩的40%。

现在给出20位评委对某一个参赛选手的打分值,请编写一个程序计算该选手的最终总成绩。

输入

单组输入。

每组输入包含两行。

第1行输入10个取值在[80, 100]之间的正整数,表示10个专业评委的给分,两两之间用英文空格隔开。

第2行输入10个取值在[80, 100]之间的正整数,表示10个学生评委的给分,两两之间用英文空格隔开。

输出

输出该选手的最终总成绩,结果四舍五入保留两位小数。

样例输入 Copy
复制代码
80 85 85 90 85 85 85 85 85 85
90 90 90 85 85 90 90 95 95 90
样例输出 Copy
复制代码
87.00
#include<stdio.h>
int main()
{
    int a[10],b[10],i,t,j;
    double x,y,c=0,d=0;
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    for(j=0;j<9;j++)
        for(i=0;i<9-j;i++)
            if(a[i]>a[i+1])
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
            }
    for(i=0;i<10;i++)
        scanf("%d",&b[i]);
    for(j=0;j<9;j++)
        for(i=0;i<9-j;i++)
            if(b[i]>b[i+1])
            {
                t=b[i];
                b[i]=b[i+1];
                b[i+1]=t;
            }
    c=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8];
    d=b[1]+b[2]+b[3]+b[4]+b[5]+b[6]+b[7]+b[8];
    x=c/8;
    y=d/8;
    printf("%.2lf\n",x*0.6+y*0.4);
    return 0;
}

J: HNUCM的智能门控

HNUCM图书馆新装了一套智能门控系统,每个人进出图书馆时都需要刷一下校园卡,系统将自动记录一次通行数据。

某同学进图书馆时刷一次卡,系统记录一次校园卡ID信息,即校园卡卡号信息;当他出图书馆时再刷一次卡,系统将再记录一次校园卡ID信息。这些进、出图书馆的校园卡ID信息将构成一个序列。

HNUCM的同学们素质都非常高,他们不会乱刷校园卡。

现在给出一个校园卡ID的序列,请你编写一个程序统计当前图书馆的在馆人数,假定开始时图书馆空无一人。

输入

单组输入。

输入一行ID序列,每一个ID都是一个六位正整数,从100000到999999,序列中元素个数不超过1000,两个ID之间用英文逗号分隔。

输出

输出当前图书馆的实时在馆人数。

样例输入 Copy
复制代码
100001 100002 100003 100003 100003 100001
样例输出 Copy
复制代码
2
#include <stdio.h>
#define N 1000010
int b[N], c[N];
int main() {
    int k = 0, a;
    while (scanf("%d", &a) != EOF) {
        b[a]++;
        if (b[a] == 1) {
            c[k++] = a;
        }
    }
    int cnt = 0;
    for (int i = 0; i < k; i++) {
        if (b[c[i]] % 2 == 1) {
            cnt++;
        }
    }
    printf("%d\n", cnt);
    return 0;
}

K: HNUCM的数学王子

Tim号称HNUCM的数学王子,他非常非常喜欢数学。

这段时间他迷上了各种素数,今天他决定研究一下梅森素数。

梅森素数来源于梅森数(Mersenne Number),梅森数是指形如(2^p-1)的正整数,其中指数p是素数,常记为Mp 。

如果一个梅森数是素数,则称为梅森素数,最小的梅森素数是3,即(2^2-1),当然7也是一个梅森素数。

现在Tim想请你帮他编写一个程序,统计两个指定正整数m和n之间(包含m和n)的梅森素数个数。

输入

单组输入。

输入两个正整数m和n,满足1<=m<n<=10^9。

输出

输出m和n之间的梅森素数个数(包含m和n)。

样例输入 Copy
复制代码
10 100
样例输出 Copy
复制代码
1
提示

10到100之间只有31这一个梅森素数。

#include<stdio.h>
int fun(int n)
{
    int i;
    for(i=2;i<n;i++)
    if(n%i==0)                                                           
        break;
    if(i==n)
        return 1;
    else
        return 0;
}
int main()
{
    int m,n,s=0,i;
    scanf("%d%d",&m,&n);
    for(i=1;i-1<m;i*=2)
    {}
    for(;i-1<=n;i*=2)
        if(fun(i-1)==1)
            s++;
    printf("%d\n",s);
    return 0;
}

L: HNUCM的综合测评

众所周知综合测评HNUCM是评定奖学金的重要依据,而其中竞赛类加分是拉开差距的关键,现给出HNUCM某学院学科竞赛和创新创业类计分标准:

学科竞赛类:

|-----|-----|-----|-----|
| | 一等奖 | 二等奖 | 三等奖 |
| 国家级 | 10 | 8 | 7 |
| 省级 | 8 | 6 | 5 |
| 校级 | 5 | 4 | 3 |
| 院级 | 3 | 2 | 1 |

创新创业类:

|-----|-----|-----|-----|
| | 一等奖 | 二等奖 | 三等奖 |
| 国家级 | 9 | 7 | 6 |
| 省级 | 7 | 6 | 5 |
| 校级 | 5 | 3 | 2 |
| 院级 | 2 | 1 | 0.5 |

注意如果获奖是个人奖则记全部分数,如果该获奖是团队获奖则都减半记分。现给出biscuit的获奖情况,你能帮他计算他竞赛的加分是多少吗?

输入

单组输入。

第一行一个正整数N(N<=1000),表示biscuit有N个竞赛获奖。

接下来N行,每行的输入格式如下,由空格隔开:

  • 第一个为一个字母'X'或'C'(X代表该奖项是学科竞赛类,C代表是创新创业类)
  • 第二个为一个数字A(A=0表示个人获奖,A=1表示团队获奖)
  • 第三个为一个数字B(B=1表示该奖项是国家级,B=2表示省级,B=3表示校级,B=4表示院级)
  • 第三个为一个数字C(C=1表示一等奖,C=2表示二等奖,C=3表示三等奖)

保证输入合法。

输出

biscuit的竞赛加分数。(结果保留两位小数)

样例输入 Copy
复制代码
5
X 0 1 3
C 1 2 2
X 0 4 1
X 0 2 1
X 1 2 3
样例输出 Copy
复制代码
23.50
#include <stdio.h>
double a[2][4][3] = {
    {{10, 8, 7}, {8, 6, 5}, {5, 4, 3}, {3, 2, 1}},
    {{9, 7, 6}, {7, 6, 5}, {5, 3, 2}, {2, 1, 0.5}}
};
int main() {
    int n;
    double s = 0.0;
    scanf("%d", &n);
    while (n--) {
        char c;
        int x, y, z;
        scanf(" %c %d %d %d", &c, &x, &y, &z);
        s += a[c == 'C'][y - 1][z - 1] * (x ? 0.5 : 1);
    }
    printf("%.2lf\n", s);
    return 0;
}
相关推荐
小王爱吃月亮糖36 分钟前
C++进阶-1-单继承、多继承、虚继承
开发语言·c++·笔记·学习·visual studio
落魄君子1 小时前
SVM分类-支持向量机(Support Vector Machine)
神经网络·算法·支持向量机·分类
Am心若依旧4091 小时前
[c++进阶(三)]单例模式及特殊类的设计
java·c++·单例模式
小王爱吃月亮糖1 小时前
补充--C++的项目结构和管理
数据结构·c++·笔记·学习
因特麦克斯1 小时前
如何实现对象的克隆?如何实现单例模式?
c++·单例模式
CSND7401 小时前
Ubuntu vi(vim)编辑器配置一键补全main函数
linux·c语言·ubuntu·编辑器·vim
上理考研周导师2 小时前
【单片机原理】第1章 微机基础知识,运算器,控制器,寄存器,微机工作过程,数制转换
算法
Crazy learner2 小时前
C 和 C++ 动态库的跨语言调用原理
c语言·c++
IT猿手3 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
金士顿5 小时前
MFC 文档模板 每个文档模板需要实例化吧
c++·mfc