2019级第一次月赛暨ACM工作室第一次招新赛、补题赛

A:最简单签到,没有之一

Description
此题简单如题意,就是求最大值


Input
多组输入

每组输入输入一串字符串(包括字母和数字),长度小于500


Output
每行输出字符ASCII值与出现次数乘积的最大值


Sample Input 1 
0aA
aaaaa
0000az
Sample Output 1
97
485
192
Hint
0000az:‘0’出现448*4=192

‘a’出现197*1=97

思路如下

这题首先是要多组输入,然后要把每组数据输入到一个char数组里,之后用桶排的方法去统计各字符出现的次数,最后定义一个最大值去存储 字符与ASCALL码的乘积的最大值,然后输出。


题解如下

#include
#include

int main()
{

    char ar[999];


    while (scanf("%s",ar)!=EOF)
    {
        int br[123]={0};   //br要放到while循环里面,每次驯化都初始化
        int LEN_ar=(int)strlen(ar);
        for(int i=0;i<LEN_ar;i++)
        {
            br[ar[i]]++;
        }
        int max=-1;
        for(int i=0;i<123;i++)
        {
            if(max<br[i]*i)
            {
                max=br[i]*i;
            }
        }
        printf("%d\n",max);
    }


    return 0;
}






B:wr学姐的小调查

Description
wr学姐想调查工作室学长学姐的生日,并按照从大到小的顺序排序。但wr学姐最近作业很多,没有时间,所以请你帮她排序。


Input
有2行,

第1行为工作室总人数n;

第2行至第n+1行分别是每人的姓名s、出生年y、月m、日d。


Output
有n行,

即n个生日从大到小学长学姐的姓名。(如果有两个学长学姐生日相同,输入靠后的学长学姐先输出)


Sample Input 1 
3
xsaxs 1999 2 15
kuzhese 2000 12 5
uixes 2001 2 4
Sample Output 1
xsaxs
kuzhese
uixes

思路如下

这题就是要自己定义结构体去存多种储数据类型,让后用sort函数去排序,sort(),函数的第三参数(比较函数)需要自己来编写,最后输出就行了


题解如下


#include
#include
#include

struct Man
{
    char name[10];
    int year;
    int month;
    int day;
};
bool cmp_sort(Man a,Man b)  // 注意:这里要弄懂比较好数要怎么编写,要注意一点,只有当这个函数的返回值为 假(false)当时候这时候才发生交换!!!
{
    if(a.year>b.year)
    {
        return false;
    }
    else if(a.year==b.year&&a.month>b.month)
    {
        return false;
    }
    else if(a.year==b.year&&a.month==b.month&&a.day>b.day)
    {
        return false;
    }
    else
        return true;

}

using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    Man man[n];
    for(int i=0;i<n;i++)
    {
        scanf("%s",man[i].name);
        scanf("%d%d%d",&man[i].year,&man[i].month,&man[i].day);
    }

    sort(man,man+n,cmp_sort);
    for(int i=0;i<n;i++)
    {
        printf("%s\n",man[i].name);
    }

    return 0;
}


C:小仙女的烦恼(三)

Description

小仙女最近吃胖了不少,她很郁闷,很怕被人说胖,但是如果班上有女生比她更胖,她就会充满动力啦~

众所周知,xxn现在体重120,班上有n个人,如果有女生的体重比她重,她就会很开心,否则她将超级难过!!!!


Input
多组输入没次输入一个整数n,代表n行。

之后n行每行一个数字a和一个字符串s分别代表体重和性别;(0<=a<=1000)


Output
如果xxn开心的话输出 "哈哈哈",否则输出 " 嘤嘤嘤";


Sample Input 1 
2
120 woman
130 woman
Sample Output 1
hhh

思路如下

对每组数据进行判断看是否有符合题意的输出


解题如下

#include

struct Student
{
    char gender[5];
    int weight;
};


int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        Student mate[n];
        for(int i=0;i<n;i++)
        {
            scanf("%d%s",&mate[i].weight,mate[i].gender);
        }
        int flag=0;  //先假设所有女生体重小于120
        for(int i=0;i<n;i++)
        {
            if(mate[i].gender[0]=='w'&&mate[i].weight>120)
            {
                flag=1;  //满足题意大于120,设为真值
            }
        }
        if(flag==1)
        {
            printf("hhh\n");
        }
        else
        {
            printf("yyy\n");
        }

    }


    return 0;
}



D:pxj爱喝可乐

Description

pxj爱喝可乐,最近可乐公司出了一个活动:四个空可乐瓶可兑换一瓶可乐,pxj当然不会错过这次机会,她买了p瓶可乐,最多可以喝几瓶呢?


Input
多组输入

每一行输入一个pxj买的可乐的数量p ( 0<=p<=10000)

当p=0时结束输入


Output
输出pxj最多可以喝的可乐数量a


Sample Input 1 
5
10
0
Sample Output 1
6
13

思路如下

这是一道 模拟题,我们只需要模拟题目所描述的过程就行了


解题如下

#include

int main()
{
    int n;
    scanf("%d",&n);
    while (n!=0)
    {
        int sum=n;   //总共可以喝的瓶数
        int sur_bottle=n; //喝完剩余的瓶树
        for(int i=0; ;i++)
        {
            if(sur_bottle>=4)
            {
                sum+=sur_bottle/4;
                sur_bottle=sur_bottle/4+sur_bottle%4;

            }
            else
            {
                break;
            }
        }

        printf("%d\n",sum);
        scanf("%d",&n);
    }

    return 0;
}


E:智斗南工白嫖王

Description

“人类用十进制,上帝用二进制”

ZCR和ZHY是510的两大肥宅,每天中午点外卖是他们最快乐的事情,可算账的时候ZCR很头疼,因为ZCR只会二进制而ZHY只会十六进制,并且ZHY总是仗着ZCR没法换算二人的账单而不给钱。忍一时越想越气,退一步越想越亏,于是ZCR想请你帮忙换算二人的账单。ZCR给你一个十六进制数字,代表ZHY的账单,请你把它换算成ZCR认识的二进制。


Input
第一行输入T,代表下面有T组数据。

每组数据第一行输入一个n,代表有一个16进制数,不带0x(例如给出一个十进制的0,在十六进制里它表示为00,此处就是说它在十六进制里仍然表示为0,而不是00,详细的可以看c语言附录A),A~F均为大写。

(1 ≤ T, n, m  ≤ 1e9)


Output
每行输出保留前导零的n的2进制。(保留前导0的规则为:n不是4的倍数的话,要把n补0补成4的倍数。

例如:1,保留前导零之后为0001

11110,保留前导0之后为00011110)


Sample Input 1 
2
A
0
Sample Output 1
1010
0000
Hint
十六进制在数学中是一种逢161的进位制。一般用数字09和字母A到F(或a~f)表示,其中:A~F表示10~15,这些称作十六进制数字。

例如十进制数10,在二进制写作1010,在16进制写作A。(可以看一下C语言课本的附录A哦)

思路如下

这题是让 十六进制转化为二进制,根据提示我们知道 在二进制下的 4位对应十六进制下的1位,那我们就可以反过来想(反过来转换)1位对应二进制下的4位,根据十六进制下的某一是什么,进行输出就行了


题解如下

#include
#include

int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        char ar[9999];
        scanf("%s",ar);
        int LEN_ar=(int)strlen(ar);
        for(int i=0;i<LEN_ar;i++)
        {
            switch (ar[i])
            {
                case '0':printf("0000");break;
                case '1':printf("0001");break;
                case '2':printf("0010");break;
                case '3':printf("0011");break;
                case '4':printf("0100");break;
                case '5':printf("0101");break;
                case '6':printf("0110");break;
                case '7':printf("0111");break;
                case '8':printf("1000");break;
                case '9':printf("1001");break;
                case 'A':printf("1010");break;
                case 'B':printf("1011");break;
                case 'C':printf("1100");break;
                case 'D':printf("1101");break;
                case 'E':printf("1110");break;
                case 'F':printf("1111");break;

                default:
                    break;
            }
        }
        printf("\n");
    }
    return 0;
}


I我是签到题

Description

YZJ学长要寻找最大值,但是他不会,所以要询问学弟学妹们该怎么办?

这个问题是这样的:请在正整数n中删除m个数字, 使得余下的数字按原次序组成的新数最大,

比如当n=92081346718538,m=10时,则新的最大数是9888


Input
有多组测试数据

每组测试数据包含两个正整数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,并且m小于n的位数)


Output
每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数


Sample Input 1 
92081346718538 10
1008908 5
Sample Output 1
9888
98

思路如下

如果要想求去掉一些数字后,按原序组成的最大值,就要明白,要先让第一位最大,其次是第二位,然后依次往下,
解题如下

#include
#include

int main()
{
    char ar[9999];
    int n;
    while(scanf("%s%d",ar,&n)!=EOF)
    {
    int LEN_ar=(int)strlen(ar);
    int br[9999];
    for(int i=0;i<LEN_ar;i++)
    {
        br[i]=ar[i]-'0';
    }
    int *p_1,*p_2;  //p_1指向待筛选区域起始位置,p_2待筛选区域终点位置
    p_1=&br[0];
    p_2=&br[LEN_ar-(LEN_ar-n)];
    int *temp_p;  //做中间变量
    for(int i=0;i<LEN_ar-n;i++)  //删除数字后有几位,就循环几次,已确定每一位的最大值
    {
        int max=-1;  //某位 所能去到的最大值
        for(int *j=p_1;j<=p_2;j++)  //循环遍历
        {
            if(max<*j)
            {
                max=*j;
                temp_p=j;
            }
        }
        printf("%d",max);
        //更新筛选区域
        p_1=temp_p+1;
        p_2++;  
    }
        printf("\n");
    }




    return 0;
}


J签到不签到他们说了不算

Description

yzj是一个贪吃鬼,而且他还特别喜欢吃一整块的东西(什么叫一整块的东西?就是这个东西是矩形而且是实心的,中间不能有其他东西,吃的东西用‘*’来表示)。yzj不知道从哪里得到了几块吃的东西,但是这个高为
n
n的东西有一部分不能吃(被污染了!!!用‘.’来表示)。然而yzj是一个吃货,你宁愿失去一些重要的东西去找巫婆交换来使这个高为n的东西给搞得可以吃!巫婆可以把‘.’号变成‘*’号,以此来使这个残缺的东西有一整块可以吃。但是巫婆为了减少负担肯定会减少把‘.’变成‘*’的次数。

聪明的你可以输出巫婆最少要把那些位置变成‘*’号嘛!


Input
多组输入,先输入一个
n
n,再输入
n
n行。表示一个图 (
1
≤
n
≤
100
1≤n≤100)


Output
输出符合题意的
n
n行的图形,哪些位置巫婆要把它变成‘*’,你就输出‘*’号,否则输出‘.’,图形后面有一个空行


Sample Input 1 
3
..**..
.*..*.
......
Sample Output 1
.*..*.
..**..
......
Sample Input 2 
5
*.......
....*...
........
........
..*.....
Sample Output 2
.****...
****....
*****...
*****...
**.**...
Hint
输入和输出图形叠加之后刚好有一个被‘*’号覆盖的矩形方块

思路如下

这一题要明白,这一题的本质就是要找一个最小矩形(这样可以让巫婆施最少的法),如何确定这个矩形呢,只需要确定对角线上的两个点(max_x,max_y)、(min_x,min_y),这两个点的横竖坐标都是 极值,我们只需要定义变量获取这些,极值就行了,有了极值就能确定矩形区域,在矩形区域内我们只需 把 . 号变为 *,*号变为 . 号即可,在矩形区域以外的区域全打印 . 号就行了

解题如下

#include
#include

int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
    char ar[n][200];
    for(int i=0;i<n;i++)
    {
        scanf("%s",ar[i]);

    }
    int LEN_w=strlen(ar[0]);
    int max_x=-1,max_y=-1,min_x=9999,min_y=9999;
    for(int i=0;i<n;i++)       //遍历数组,去求横竖坐标极值
    {
        for(int j=0;j<LEN_w;j++)
        {
            if(ar[i][j]=='*')
            {
                    if(max_x<i)
            {
                max_x=i;

            }
                if(max_y<j)
                {

                    max_y=j;
                }
                if(min_x>i)
                {
                    min_x=i;

                }
                if(min_y>j)
                {

                    min_y=j;
                }
            }
        }

    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<LEN_w;j++)
        {
            if(i>=min_x&&i<=max_x&&j>=min_y&&j<=max_y)  //在矩形区域内
            {
                if(ar[i][j]=='*')
                    printf(".");
                else
                    printf("*");
            }
            else     //在矩形区域外
            printf(".");

        }
        printf("\n");


    }
    printf("\n");
}

    return 0;
}


圈钱杯

Description

最近开始申请单项奖学金,没去圈钱杯(蓝桥杯)国赛的nuoyanli很伤心(¥_¥),nuoyanli决定在下一届圈钱杯(蓝桥杯)之前进行训练(虚假)。

在训练的第一天,他应该完全解决一个问题,第二天应该解决两个问题,第三天则完全解决三个问题,依此类推:在第k天,他应该解决k个问题。
nuoyanli有n个比赛的列表,第i个比赛包括ai
​	
 ```c
 问题。在每一天中,nuoyanli都必须选择自己尚未解决的竞赛中的一种并加以解决。

他从这场比赛中准确地解决了
k
k个问题(其他问题也从中丢弃)。

如果在第k
天没有至少由nuoyanli尚未解决的
k个问题组成的比赛,则nuoyanli停止训练。
假设nuoyanli一定会最佳选择比赛,请问他最多可以训练多少天?
Input
输入的第一行包含一个整数
n(1≤n≤210^5)n1≤n≤210^5表示比赛数。

输入的第二行包含
n
n个整数a1,a2,…,an(1≤ai≤2105)a 1​	 ,a 2​	 ,…,a n​	(1≤a i​	≤2105)第i场比赛中的问题数。


Output
打印一个整数,假设nuoyanli会最佳选择比赛,nuoyanli可以训练的最大天数。


Sample Input 1 
3
1 1 1
Sample Output 1
1
Sample Input 2 
4
3 1 4 1
Sample Output 2
3

思路如下

这题就是排序完数组,进行一天天的比较。看最多有多少天符合题意


#include
#include
#include
using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    int ar[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&ar[i]);
    }
    sort(ar,ar+n);  // 排序以供 筛选使用
    int day=0;
    int j=0;  //初始化j
    int temp;  //存储每一次筛选之后的j的起始值
    for(int i=1;i<=n;i++)   // i表示第几天
    {
        int flag=0;
        for( ;j<n;j++)
        {
            if(ar[j]>=i)   //看是数组ar否有值 满足地i天的i题需要
            {
                day++;
                flag=1;
                temp=j;
                break;
            }

        }
        if(flag==0)  //如果 flag=0,说明这时后,ar中已经,没有值可以满足这一天的题数了
        {
            break;
        }
        if(flag==1) //满足这一天进行下一天的判断
        {
            j=temp+1;  //这时候 要改变j值
        }

    }
    printf("%d",day);

    return 0; 
}


G:我裂开了

Description

现在有两个整数x,y,保证x>y,(1<x,y<1e9)你可以选择任意一个素数p,并且可以从x中减去任意个p,你可以将x变成y吗?


Input
T组输入

每组输入包括两个整数x,y


Output
如果可以输出YES

否则输出NO


Sample Input 1 
4
100 98
42 32
10000000 1
41 40
Sample Output 1
YES
YES
YES
NO
Hint
素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数
```c
***
**思路如下**
>真是一道智障题,需要理解要能否把x减去n个相同的素数(可以自己任意选)变成y,这要去定x-y!=1就符合题意!!!!!

**题解如下**
```c
#include

int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        int cha=a-b;
        if(cha==1)
        {
            printf("NO\n");
        }
        else
        {
           /* if(cha%2==0||(cha-1)%2==0)
            {
                printf("YES\n");
            }
            else
            {
                printf("NO\n");
            }
            */
            printf("YES\n");
        }
    }
    return 0;
}

你可能感兴趣的:(比赛补题总结)