0
点赞
收藏
分享

微信扫一扫

PTA_2017年天梯赛全国总决赛

A邱凌 2022-03-13 阅读 71
知识图谱

目录

L1-1 寻找250 (10 分)

L1-2 日期格式化 (5 分)

L1-3 阅览室 (20 分)

L1-4 稳赢 (15 分)

L1-5 宇宙无敌大招呼 (5 分)

L1-6 整除光棍 (20 分)

L1-7 装睡 (10 分)

L1-8 矩阵A乘以B (15 分)

L2-1 点赞狂魔 (25 分)

L2-2 重排链表 (25 分)

L2-3 图着色问题 (25 分)

L2-4 部落 (25 分)


L1-1 寻找250 (10 分)

//
L1-1 寻找250 (10 分)

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。

输入格式:
输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。

输出格式:
在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。

输入样例:
888 666 123 -233 250 13 250 -222
输出样例:
5

// L1-1 寻找250 (10 分)
#include<bits/stdc++.h>
using namespace std;

const int ANS=250;
vector<int> v;

void split( string s )
{
    stringstream ss; ss<<s;

    int a; while( ss>>a ) v.push_back(a);
}

int main()
{
    string s; int i;

    while( getline( cin,s ) )
    {
        split(s);
        for( i=1;i-1<v.size();i++ )
        {
            if( v[i-1]==ANS ) break;
        }
        cout<<i<<endl;
    }
    return 0;
}





// L1-1 寻找250 (10 分)
#include<bits/stdc++.h>
using namespace std;

const char judge[]="250";
const int N=1e6+7;
char str[N][11];

int main()
{
    int pos=0,i;
    char ch;

    while( ~scanf("%s%c",str[pos++],&ch) && ch!='\n' );
    
    for( i=1;i-1<pos;i++ )
    {
        if( strcmp( str[i-1],judge )==0 ) break;
    }
    printf("%d\n",i);

    return 0;
}

L1-2 日期格式化 (5 分)

//
L1-2 日期格式化 (5 分)
世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。

输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

输入样例:
03-15-2017
输出样例:
2017-03-15

 

// L1-2 日期格式化 (5 分)
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int y,m,d;
    while( ~scanf("%d-%d-%d",&m,&d,&y) )
    {
        printf("%04d-%02d-%02d\n",y,m,d);
    }
    return 0;
}

L1-3 阅览室 (20 分)

//
L1-3 阅览室 (20 分)
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下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

L1-4 稳赢 (15 分)

//
L1-4 稳赢 (15 分)
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

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

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

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

输入样例:
2
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
ChuiZi
End
输出样例:
Bu
ChuiZi
Bu
ChuiZi
JianDao
ChuiZi
Bu

// L1-4 稳赢 (15 分)
#include<bits/stdc++.h>
using namespace std;

const string S1="ChuiZi";
const string S2="JianDao";
const string S3="Bu";
const string S="End";

vector<string> v;

int main()
{
    string s;
    int cnt,k;

    while( cin>>k )
    {
        cin.get(); cnt=0;

        while( getline( cin,s ) )
        {
            if( s==S ) break;

            if( cnt==k ) v.push_back(s),cnt=0;
            else if( s==S1 ) v.push_back( S3 ),cnt++;
            else if( s==S2 ) v.push_back( S1 ),cnt++;
            else if( s==S3 ) v.push_back( S2 ),cnt++;
        }
        for( auto i:v ) cout<<i<<endl;
    }
    return 0;
}

L1-5 宇宙无敌大招呼 (5 分)

//
L1-5 宇宙无敌大招呼 (5 分)
据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”,跟这个世界打个招呼。作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼。

输入格式:
输入在第一行给出一个星球的名字S,是一个由不超过7个英文字母组成的单词,以回车结束。

输出格式:
在一行中输出Hello S,跟输入的S星球打个招呼。

输入样例:
Mars
输出样例:
Hello Mars

// L1-5 宇宙无敌大招呼 (5 分)
#include<bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    while( getline( cin,s ) )
    {
        cout<<"Hello "<<s<<endl;
    }
    return 0;
}

L1-6 整除光棍 (20 分)

//
L1-6 整除光棍 (20 分)
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:
输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:
在一行中输出相应的最小的s和n,其间以1个空格分隔。

输入样例:
31
输出样例:
3584229390681 15

// L1-6 整除光棍 (20 分)
#include<bits/stdc++.h>
using namespace std;

vector<int> v;

int main()
{
    int x,flag,remain,temp,cnt,i;
    while( cin>>x )
    {
        for( cnt=1;;cnt++ )
        {
            v.clear();          // 注意初始化
            for( flag=remain=i=0;i<cnt;i++ )
            {
                temp=( 10*remain+1 )/x;

                if( flag ) v.push_back(temp);       // 消除前导零
                else if( temp ) flag=1,v.push_back(temp);

                remain=( 10*remain+1 )%x;
            }
            if( remain==0 ) break;
        }
        for( auto i:v ) cout<<i;    // not endl
        cout<<' '<<cnt<<endl;
    }
    return 0;
}
// 思考 运算过程 另辟蹊径

L1-7 装睡 (10 分)

//
L1-7 装睡 (10 分)
你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。

输入格式:
输入在第一行给出一个正整数N(≤10)。随后N行,每行给出一个人的名字(仅由英文字母组成的、长度不超过3个字符的串)、其呼吸频率和脉搏(均为不超过100的正整数)。

输出格式:
按照输入顺序检查每个人,如果其至少一项指标不在正常范围内,则输出其名字,每个名字占一行。

输入样例:
4
Amy 15 70
Tom 14 60
Joe 18 50
Zoe 21 71
输出样例:
Tom
Zoe

// L1-7 装睡 (10 分)
#include<bits/stdc++.h>
using namespace std;

const int N=111;
bool x[N][N];

void init()
{
    memset( x,0,sizeof( x ) );
    for( int i=15;i<=20;i++ )
        for( int j=50;j<=70;j++ )
            x[i][j]=1;
}

int main()
{
    init(); 
    int n,a,b;
    char name[11];

    while( ~scanf("%d",&n) )
    {
        while( n-- )
        {
            scanf("%s %d %d",name,&a,&b );
            if( x[a][b]==0 ) printf("%s\n",name);
        }
    }
    return 0;
}





// L1-7 装睡 (10 分)
#include<bits/stdc++.h>
using namespace std;

int main()
{
    char name[11];
    int n,a,b;

    while( ~scanf("%d",&n) )
    {
        while( n-- )
        {
            scanf("%s %d %d",name,&a,&b);   // b 对应变量
            if( !( a>=15 && a<=20 ) || !( b>=50 && b<=70 ) ) printf("%s\n",name);
        }                                   // || 逻辑关系
    }
    return 0;
}
// 明确变量意义

 

L1-8 矩阵A乘以B (15 分)

//
输入样例1:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1:
2 4
20 22 24 16
53 58 63 28
输入样例2:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2:
Error: 2 != 3

L2-1 点赞狂魔 (25 分)

 

//
输入样例:
5
bob 11 101 102 103 104 105 106 107 108 108 107 107
peter 8 1 2 3 4 3 2 5 1
chris 12 1 2 3 4 5 6 7 8 9 1 2 3
john 10 8 7 6 5 4 3 2 1 7 5
jack 9 6 7 8 9 10 11 12 13 14
输出样例:
jack chris john

L2-2 重排链表 (25 分)

 

//
输入样例:
00100 6
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
68237 6 00100
00100 1 99999
99999 5 12309
12309 2 00000
00000 4 33218
33218 3 -1

L2-3 图着色问题 (25 分)

//
L2-3 图着色问题 (25 分)
图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?

但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。

输入格式:
输入在第一行给出3个整数V(0<V≤500)、E(≥0)和K(0<K≤V),分别是无向图的顶点数、边数、以及颜色数。顶点和颜色都从1到V编号。随后E行,每行给出一条边的两个端点的编号。在图的信息给出之后,给出了一个正整数N(≤20),是待检查的颜色分配方案的个数。随后N行,每行顺次给出V个顶点的颜色(第i个数字表示第i个顶点的颜色),数字间以空格分隔。题目保证给定的无向图是合法的(即不存在自回路和重边)。

输出格式:
对每种颜色分配方案,如果是图着色问题的一个解则输出Yes,否则输出No,每句占一行。

输入样例:
6 8 3
2 1
1 3
4 6
2 5
2 4
5 4
5 6
3 6
4
1 2 3 3 1 2
4 5 6 6 4 5
1 2 3 4 5 6
2 3 4 2 3 4
输出样例:
Yes
Yes
No
No

L2-4 部落 (25 分)

 

//
输入样例:
4
3 10 1 2
2 3 4
4 1 5 7 8
3 9 6 4
2
10 5
3 7
输出样例:
10 2
Y
N

举报

相关推荐

0 条评论