2016级ACM寒假训练(一)

时间:2021-12-08 13:50:33

伞兵的日常训练(黄色)

Problem:A

Time Limit:1000ms

Memory Limit:65535K

Description

 跳伞是一个技术活,某空军新来了一批新兵,为了训练新兵跳伞的准确度,指挥官想了一个好办法,他在训练场画了一个矩阵,每个格子有一个数字,如果某士兵跳到了(x,y)格点,那么他的得分便是他周围的八个格子上的数字之和,现在给以一个n*m个矩阵,求出最大分值是多少。

Input

多组输入,第一行数一两个数 n,m,然后有一个n*m的矩阵,(n,m<=100),矩阵里的数字都小于1000.

Output

每组输出一个结果,最大分值

Sample Input

3 3
1 2 2
5 3 1
7 5 1

Sample Output

24

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int data[105][105];
int inp[105][105];
int m,n,i,j,max1;
while(scanf("%d%d",&m,&n)!=-1)
{
memset(data,0,sizeof(data));
memset(inp,0,sizeof(inp));
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&inp[i][j]);
max1=-999999;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
data[i][j]=data[i][j]+inp[i-1][j]+inp[i-1][j-1]+inp[i-1][j+1];
data[i][j]=data[i][j]+inp[i][j-1]+inp[i][j+1];
data[i][j]=data[i][j]+inp[i+1][j]+inp[i+1][j-1]+inp[i+1][j+1];

}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if (max1<data[i][j]) max1=data[i][j];

printf("%d\n",max1);
}


return 0;
}
伞兵的那个题老师在群里传题解了,已经很详细了,不再赘述
所以说,这个题可以不用进行两次二重for循环的,自己试着改改,嘿嘿

字符集合

Problem:B

Time Limit:1000ms

Memory Limit:65535K

Description

编写函数向给定一个字符集合中,插入一个新字符到指定位置:已知一个字符集,给定一个插入位置k,向该位置插入一个新字符。本题10分

Input

 输入数据有多组,每组的第1行为n(&lt;5),表示一组测试数据中字符集的个数,接下来原始字符串集(字符个数&lt;100),插入的字符及位置;

Output

输出插入后的新字符集,每组数据单独一行。

Sample Input

3
the c test
D
5
Now,you can commit.
Y
8
the game over.
N
6

Sample Output

the cD test
Now,you Ycan commit.
the gaNme over.

Hint

注意原始数据输入时,回车的处理。
输出正常输完一行加个换行。

#include <stdio.h>
#include <string.h>

int main()
{
char a[1000],b,d,e;
int i,o,p,c,len;
while(scanf("%d",&c)!=-1)
for(o=0;o<c;o++)
{
getchar();
gets(a);
scanf("%c%d",&b,&i);
len=strlen(a);
d=a[i];
a[i]=b;
for(p=i+1;p<=len;p++)
{
e=a[p];
a[p]=d;
d=e;//依次向后串一个字符
}
puts(a);
}
return 0;
}
下面有写的更好的写法

#include <stdio.h>
#include <string.h>
char s[1005],a[10];
int m;
int main()
{
int T;
scanf("%d%*c",&T);
while(T--)
{
gets(s);
int n=strlen(s);
scanf("%s%d%*c",a,&m);
for(int i=0;i<m;i++)printf("%c",s[i]);
printf("%c%s\n",a[0],s+m);//直接打印后面的字符串
}
return 0;
}

第1题

Problem:C

Time Limit:1000ms

Memory Limit:65535K

Description

星星和月亮
天空中有很多星星,这些星星用*号来表示;另外天空中有许多月亮,这些月亮用@来表示;现在让你计算星星的个数与月亮的个数的乘积,聪明的你能计算出来吗?

Input

输入数据有多组,每组为1个长度小于100的字符串,字符串中可能包含许多*和@等字符数字,但肯定没有空格。

Output

在一行内输出星星和月亮的数量的乘积。

Sample Input

---@@@--*-*0
22001166*

Sample Output

6
0

真的没啥好说的……

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 105;
char s[MAXN];
int main()
{
while(cin>>s)
{
int len = strlen(s);
int sum1=0, sum2=0;
for(int i=0; i<len; i++)
{
if(s[i]=='*')
sum1
++;
if(s[i]=='@')
sum2
++;
}
cout
<<sum1*sum2<<endl;
}
return 0;
}

言语的力量

Problem:D

Time Limit:1000ms

Memory Limit:65536K

Description

其实,在言语中,有着一股不可轻视的力量。比如远古的大陆上,人们在战斗时会吼出Fus Ro Dah威慑敌人。再比如遥远的星系中外星人会说En Taro给予他人祝福。
那么他们到底有多少力量呢?现在有一种算法可以计算出来:每一段的首字母的ASCII码整除这一段的长度,再相加。现在请你来算一算给出的言语的力量。

Input

多组数据,每组数据一行字符串(包括大小写字母和空格,不保证空格位置)。
(保证长度小于500)

Output

每组数据输出一行,输出力量值。

Sample Input

Fus Ro Dah
En Taro

Sample Output

86
55
#include<iostream>
#include<cstdio>
#include<cstring>
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
using namespace std;
char a[1000];
while(gets(a))
{
int sum=0;
int len=strlen(a);
 for(int i=0;i<len;i++)
{
int count=0;
if(a[i]>='A'&&a[i]<='z')
{
int c=i;
while((a[i]!=' ')&&i<len)
{count++;i++;}
sum=sum+a[c]/count;
}
}
cout<<sum<<endl;
}
return 0;
}

这个题貌似是练习strlen函数的

void基因组

Problem:E

Time Limit:1000ms

Memory Limit:65536K

Description

在Daten City生物体内的基因是由小写字母和空格组成,并且都有一块名为void的基因组,该基因组位于void子串开始到下一个空格(不包括void和空格).
如:基因为sss voidfff ab,则void基因组为fff.
邪恶的研究者想把该基因区域抽出来.你,就是邪恶的研究者.邪恶的你现在面对着两只抱在一起颤栗的草履虫......你需要做的是抽出两只草履虫的void的基因组然后合并.
Daten City的草履虫只有一个void基因组.

Input

输入数据有多组,每组第一行是第一只草履虫的基因序列,第二行是是第二只草履虫的基因序列.
因为是草履虫,所以基因序列不超过500.
保证void只有一个并且合法,void基因序列不为空.在void基因序列后肯定有空格(以空格为结束符).

Output

输出一行:两只草履虫的void的基因组合并后的序列(第一只在前,第二只在后,没有分隔符).

Sample Input

sss voidfff ab
ab voidex s s s

Sample Output

fffex
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
int i;
char a[500],b[500];
while(gets(a)!=NULL)
{
gets(b);
for(i=0;!(a[i]=='v'&&a[i+1]=='o'&&a[i+2]=='i'&&a[i+3]=='d');i++);
i+=4;
while(a[i]!=' '&&a[i]!='\0')
{
printf("%c",a[i]);
i++;
}
for(i=0;!(b[i]=='v'&&b[i+1]=='o'&&b[i+2]=='i'&&b[i+3]=='d');i++);
i+=4;
while(b[i]!=' '&&b[i]!='\0')
{
printf("%c",b[i]);
i++;
}
printf("\n");

}
return 0;
}

就是找void啊……

————由于这次的题实在是太简单了,题解没法写的更详细了……大家有不会的群里问吧