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

时间:2021-02-06 22:07:33

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

Description
此题简单如题意,就是求最大值 Input
多组输入 每组输入输入一串字符串(包括字母和数字),长度小于500 Output
每行输出字符ASCII值与出现次数乘积的最大值 Sample Input 1
0aA
aaaaa
0000az
Sample Output 1
97
485
192
Hint
0000az:‘0’出现4次 48*4=192 ‘a’出现1次 97*1=97

思路如下

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


题解如下

#include<stdio.h>
#include<string.h> 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<stdio.h>
#include<iostream>
#include<algorithm> 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<stdio.h>

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<stdio.h>

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
十六进制在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或a~f)表示,其中:A~F表示10~15,这些称作十六进制数字。 例如十进制数10,在二进制写作1010,在16进制写作A。(可以看一下C语言课本的附录A哦);

思路如下

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


题解如下

#include<stdio.h>
#include<string.h> 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<stdio.h>
#include<string.h> 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<stdio.h>
#include<string.h> 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≤2⋅10^5)n1≤n≤2⋅10^5表示比赛数。 输入的第二行包含
n
n个整数a1,a2,…,an(1≤ai≤2⋅105)a 1​ ,a 2​ ,…,a n​ (1≤a i​ ≤2⋅105)第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<stdio.h>
#include<string.h>
#include<algorithm>
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<stdio.h> 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;
}