JAVA天梯赛试卷_2017年天梯赛部分真题加Pat部分题目(1)

稳赢(2017年真题)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

of_oo9zfrbo2e3.jpg

现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次就让一个平局。

输入格式:

输入首先在第一行给出正整数K(<=10),即平局间隔的次数。随后每行给出对方的一次出招:“ChuiZi”代表“锤子”、“JianDao”代表“剪刀”、“Bu”代表“布”。“End”代表输入结束,这一行不要作为出招处理。

输出格式:

对每一个输入的出招,按要求输出稳赢或平局的招式。每招占一行。

输入样例:

2

ChuiZi

JianDao

Bu

JianDao

Bu

ChuiZi

ChuiZi

End

输出样例:

Bu

ChuiZi

Bu

ChuiZi

JianDao

ChuiZi

Bu

代码如下:

#include

#include

int main()

{

int Search;

scanf("%d",&Search);

char ch[15];

int ti = 1;

while(scanf("%s",&ch),strcmp(ch,"End")!=0)

{

if(ti%(Search+1) == 0) printf("%s\n",ch);

else if(strcmp(ch,"Bu")==0)printf("JianDao\n");

else if(strcmp(ch,"ChuiZi")==0)printf("Bu\n");

else printf("ChuiZi\n");

ti++;

}

return 0;

}

输出GPLT

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按“GPLTGPLT....”这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。

输入格式:

输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。

输出格式:

在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:

pcTclnGloRgLrtLhgljkLhGFauPewSKgt

输出样例:

GPLTGPLTGLTGLGLL

代码如下:

#include

#include

#include

int main()

{

char a[10000],c[4]={'G','P','L','T'};

int i,len,q,w,e,r,b[4];

gets(a);

len=strlen(a);

q=w=e=r=0;

for(i=0;i

{

if(a[i]>='a' && a[i]<='z')

a[i]=a[i]-32;

if(a[i]=='G')

q++;

else

if(a[i]=='P')

w++;

else

if(a[i]=='L')

e++;

else

if(a[i]=='T')

r++;

}

b[0]=q;b[1]=w;b[2]=e;b[3]=r;

while(b[0]!=0 || b[1]!=0 || b[2]!=0 || b[3]!=0)

{

for(i=0;i<4;i++)

{

if(b[i]!=0)

{

printf("%c",c[i]);

b[i]--;

}

}

}

return 0;

}

情人节(2017年真题)

nx_onaq6r241mk.jpg

以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。

输入格式:

输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的非空单词,以回车结束。一个英文句点“.”标志输入的结束,这个符号不算在点赞名单里。

输出格式:

根据点赞情况在一行中输出结论:若存在第2个人A和第14个人B,则输出“A and B are inviting you to dinner...”;若只有A没有B,则输出“A is the only one for you...”;若连A都没有,则输出“Momo... No one is for you ...”。

输入样例1:

GaoXZh

Magi

Einst

Quark

LaoLao

FatMouse

ZhaShen

fantacy

latesum

SenSen

QuanQuan

whatever

whenever

Potaty

hahaha

.

输出样例1:

Magi and Potaty are inviting you to dinner...

输入样例2:

LaoLao

FatMouse

whoever

.

输出样例2:

FatMouse is the only one for you...

输入样例3:

LaoLao

.

输出样例3:

Momo... No one is for you ...

代码如下:

#include

#include

int main()

{

char name[20];

int flag2=0,flag14=0;

int time = 1;

char name2[20],name14[20];

while(scanf("%s",&name),strcmp(name,".")!=0)

{

if(time == 2) {strcpy(name2,name);flag2=1;}

if(time == 14) {strcpy(name14,name);flag14=1;}

time = time+1;

}

if(!flag2 && !flag14) printf("Momo... No one is for you ...\n");

else if(!flag14) printf("%s is the only one for you...\n",name2);

else printf("%s and %s are inviting you to dinner...\n",name2,name14);

return 0;

}

点赞

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。

输入格式:

输入在第一行给出一个正整数N(<=1000),是该用户点赞的博文数量。随后N行,每行给出一篇被其点赞的博文的特性描述,格式为“K F1... FK”,其中 1<=K<=10,Fi(i=1, ..., K)是特性标签的编号,我们将所有特性标签从1到1000编号。数字间以空格分隔。

输出格式:

统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。

输入样例:

4

3 889 233 2

5 100 3 233 2 73

4 3 73 889 2

2 233 123

输出样例:

233 3

代码如下:

#include

#include

#include

using namespace std;

int f[1005];

int main()

{

int ch;

scanf("%d",&ch);

memset(f,0,sizeof(f));

int k,n,Max,Max_value = -1;

for(int i=1; i<=ch; i++)

{

scanf("%d",&n);

for(int j=1; j<=n; j++)

{

scanf("%d",&k);

f[k]++;

if(Max == f[k])

Max_value = max(Max_value,k);

if(Max < f[k])

{

Max_value = k;

Max = f[k];

}

}

}

printf("%d %d\n",Max_value,Max);

return 0;

}

古风排版(2017年真题)

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)

输入样例:

4

This is a test case

输出样例:

asa T

st ih

e tsi

ce s

代码如下:

#include

#include

char a[105][105];

int main()

{

int n;

scanf("%d",&n);

char ch[1005];

getchar();

gets(ch);

int x = 1,y=1;

for(int i=0;i

{

a[x++][y] = ch[i];

if(x == n+1)

{

y++;

x = 1;

}

}

if(x!=1){

while(x<=n)

{

a[x][y] = ' ';

x++;

}

y++;

}

for(int i=1;i<=n;i++)

{

for(int j=y-1;j>=1;j--)

{

printf("%c",a[i][j]);

}

printf("\n");

}

return 0;

}

阅览室

天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。

输入格式:

输入在第一行给出一个正整数N(<= 10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:

书号([1, 1000]内的整数) 键值(“S”或“E”) 发生时间(hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)

每一天的纪录保证按时间递增的顺序给出。

输出格式:

对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。

输入样例:

3

1 S 08:10

2 S 08:35

1 E 10:00

2 E 13:16

0 S 17:00

0 S 17:00

3 E 08:10

1 S 08:20

2 S 09:00

1 E 09:20

0 E 17:00

输出样例:

2 196

0 0

1 60

代码如下:

#include

#include

#include

using namespace std;

int main()

{

int number;

scanf("%d",&number);

while(number--)

{

char ch;

int h,s,x;

int f[1005],x1[1005];

memset(f,-1,sizeof(f));

memset(x1,0,sizeof(x1));

double time=0,sum=0;

while(scanf("%d %c %d:%d",&h,&ch,&s,&x)!=EOF)

{

if(h == 0){

if(sum == 0)

printf("0 0\n");

else

printf("%.0lf %.0lf\n",sum,(time/sum));

break;

}else{

if(ch == 'S'){

f[h] = s*60+x;

}else{

if(f[h] == -1)

continue;

time = time + s*60+x - f[h];

f[h] = -1;

sum++;

}

}

}

}

return 0;

}

排座位

布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。

输入格式:

输入第一行给出3个正整数:N(<= 100),即前来参宴的宾客总人数,则这些人从1到N编号;M为已知两两宾客之间的关系数;K为查询的条数。随后M行,每行给出一对宾客之间的关系,格式为:“宾客1 宾客2 关系”,其中“关系”为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K行,每行给出一对需要查询的宾客编号。

这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。

输出格式:

对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出“No problem”;如果他们之间并不是朋友,但也不敌对,则输出“OK”;如果他们之间有敌对,然而也有共同的朋友,则输出“OK but...”;如果他们之间只有敌对关系,则输出“No way”。

输入样例:

7 8 4

5 6 1

2 7 -1

1 3 1

3 4 1

6 7 -1

1 2 1

1 4 1

2 3 -1

3 4

5 7

2 3

7 2

输出样例:

No problem

OK

OK but...

No way

代码如下:

#include

#include

using namespace std;

int fa[105];

int dd[105][105];

int find(int x)

{

return fa[x]==x?x:fa[x]=find(fa[x]);

}

void Merge(int x,int y)

{

int dx,dy;

dx=find(x);

dy=find(y);

if(dx!=dy)

{

fa[dy]=x;

}

}

int main()

{

int n,m,k;

for(int i=0;i<105;i++)

fa[i]=i;

cin>>n>>m>>k;

for(int i=0;i

{

int a,b,r;

cin>>a>>b>>r;

if(r==-1)

dd[a][b]=dd[b][a]=-1;

if(r==1)

Merge(a,b);

}

for(int i=0;i

{

int x,y;

cin>>x>>y;

if(find(x)==find(y)&&dd[x][y]!=-1)

cout<

if(find(x)!=find(y)&&dd[x][y]!=-1)

cout<

if(find(x)==find(y)&&dd[x][y]==-1)

cout<

if(find(x)!=find(y)&&dd[x][y]==-1)

cout<

}

return 0;

}

链表去重

给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点。即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留。同时,所有被删除的结点必须被保存在另外一个链表中。例如:另L为21→-15→-15→-7→15,则你必须输出去重后的链表21→-15→-7、以及被删除的链表-15→15。

输入格式:

输入第一行包含链表第一个结点的地址、以及结点个数N(<= 105 的正整数)。结点地址是一个非负的5位整数,NULL指针用-1表示。

随后N行,每行按下列格式给出一个结点的信息:

Address Key Next

其中Address是结点的地址,Key是绝对值不超过104的整数,Next是下一个结点的地址。

输出格式:

首先输出去重后的链表,然后输出被删除结点组成的链表。每个结点占一行,按输入的格式输出。

输入样例:

00100 5

99999 -7 87654

23854 -15 00000

87654 15 -1

00000 -15 99999

00100 21 23854

输出样例:

00100 21 23854

23854 -15 99999

99999 -7 -1

00000 -15 87654

87654 15 -1

代码如下:

#include

#include

///标记。s输出

int data[100000],next[100000],flag[100000],flag2[100000];

int abs(int n)

{

return n<0?-n:n;

}

int main()

{

int start,n,x,y,z;

scanf("%d%d",&start,&n);

///初始化

memset(data,-1,sizeof(data));

memset(next,-1,sizeof(next));

memset(flag,-1,sizeof(flag));

memset(flag2,-1,sizeof(flag2));

///开始存入。节点信息查询结构为data[x] = key,next[x] = next;

for(int i=0; i

{

scanf("%d %d %d",&x,&y,&z);

data[x] = y;

next[x] = z;

}

y = start;

printf("%05d %d ",start,data[start]);

flag[abs(data[start])]=1;

flag2[start] = 1;

start = next[start];

while(true)

{

while(flag[abs(data[start])]==1 && start!=-1)

start = next[start];

if(start == -1)

{

printf("%d\n",-1);

break;

}

else

printf("%05d\n%05d %d ",start,start,data[start]);

flag2[start]=1;

flag[abs(data[start])]=1;

}

start = y;

while(flag2[start]==1 && start!=-1)

start = next[start];

flag2[start]=1;

///如果没有重复的元素删除,就直接返回0,结束

if(start == -1) return 0;

while(true)

{

printf("%05d %d ",start,data[start]);

while(flag2[start]==1 && start!=-1)

start = next[start];

if(start == -1)

{

printf("-1\n");

break;

}

else

printf("%05d\n",start);

flag2[start] = 1;

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值