2022年团体程序设计天梯赛-总决赛 L1 -L2

news2024/10/5 16:26:25

目录

L1-1 今天我要赢

 L1-2 种钻石

L1-3 谁能进图书馆

L1-4 拯救外星人

L1-5 试试手气

L1-6 斯德哥尔摩火车上的题

L1-7 机工士姆斯塔迪奥

L1-8 静静的推荐

L2-1 插松枝

L2-2 老板的作息表

L2-3 龙龙送外卖

L2-4 大众情人


L1-1 今天我要赢

分数 5

2018 年我们曾经出过一题,是输出“2018 我们要赢”。今年是 2022 年,你要输出的句子变成了“我要赢!就在今天!”然后以比赛当天的日期落款。

输入格式:

本题没有输入。

输出格式:

输出分 2 行。在第一行中输出 I'm gonna win! Today!,在第二行中用 年年年年-月月-日日 的格式输出比赛当天的日期。已知比赛的前一天是 2022-04-22

输入样例:

输出样例(第二行的内容要你自己想一想,这里不给出):

I'm gonna win! Today!
这一行的内容我不告诉你…… 你要自己输出正确的日期呀~
#include<iostream>

using namespace std;

int main()
{
    cout << "I'm gonna win! Today!"<<endl;
    cout << "2022-04-23";
    return 0;
}

 L1-2 种钻石

分数 5

d.jpg

2019年10月29日,中央电视台专题报道,中国科学院在培育钻石领域,取得科技突破。科学家们用金刚石的籽晶片作为种子,利用甲烷气体在能量作用下形成碳的等离子体,慢慢地沉积到钻石种子上,一周“种”出了一颗 1 克拉大小的钻石。

本题给出钻石的需求量和人工培育钻石的速度,请你计算出货需要的时间。

输入格式:

输入在一行中给出钻石的需求量 N(不超过 107 的正整数,以微克拉为单位)和人工培育钻石的速度 v(1≤v≤200,以微克拉/天为单位的整数)。

输出格式:

在一行中输出培育 N 微克拉钻石需要的整数天数。不到一天的时间不算在内。

输入样例:

102000 130

输出样例:

784
#include<iostream>

using namespace std;

int main()
{
    int n , k;
    cin >> n >> k;
    cout << n / k;
    return 0;
}

L1-3 谁能进图书馆

分数 10

为了保障安静的阅读环境,有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆,除非有 18 岁以上(包括 18 岁)的成人陪同”。现在有两位小/大朋友跑来问你,他们能不能进去?请你写个程序自动给他们一个回复。

输入格式:

输入在一行中给出 4 个整数:

禁入年龄线 陪同年龄线 询问者1的年龄 询问者2的年龄

这里的禁入年龄线是指严格小于该年龄的儿童禁止入馆;陪同年龄线是指大于等于该年龄的人士可以陪同儿童入馆。默认两个询问者的编号依次分别为 1 和 2;年龄和年龄线都是 [1, 200] 区间内的整数,并且保证 陪同年龄线 严格大于 禁入年龄线

输出格式:

在一行中输出对两位询问者的回答,如果可以进就输出 年龄-Y,否则输出 年龄-N,中间空 1 格,行首尾不得有多余空格。

在第二行根据两个询问者的情况输出一句话:

  • 如果两个人必须一起进,则输出 qing X zhao gu hao Y,其中 X 是陪同人的编号, Y 是小孩子的编号;

  • 如果两个人都可以进但不是必须一起的,则输出 huan ying ru guan

  • 如果两个人都进不去,则输出 zhang da zai lai ba

  • 如果一个人能进一个不能,则输出 X: huan ying ru guan,其中 X 是可以入馆的那个人的编号。

输入样例 1:

12 18 18 8

输出样例 1:

18-Y 8-Y
qing 1 zhao gu hao 2

输入样例 2:

12 18 10 15

输出样例 2:

10-N 15-Y
2: huan ying ru guan
#include<iostream>

using namespace std;

int main()
{
    int a, b , x,y;
    cin >> a >> b >> x >> y;
    
    int t;
    if(x > y)
    {
        t = 1;
    }
    else{
        t = 2;
    }
    if(x < a)
    {
        if(y >= b)
        {
            cout << x<<"-"<<"Y ";
        }else
        {
            cout << x<<"-"<<"N ";
        }
    }
    else{
        cout << x<<"-"<<"Y ";
    }
    if(y < a)
    {
        if(x >= b)
        {
            cout << y<<"-"<<"Y";
        }
        else{
            cout << y<<"-"<<"N";
        }
    }
    else{
        cout << y<<"-"<<"Y";
    }
    cout <<"\n";
    if((y < a && x >= b )||(x < a && y >= b))
    {
        if(t == 1)
        {
            cout << "qing 1 zhao gu hao 2";
            return 0;
        }
        else{
            cout << "qing 2 zhao gu hao 1";
            return 0;
        }
    }
    if(x >= a && y >= a)
    {
        cout << "huan ying ru guan";
    }
    else if(x<a && y < a){
       cout << "zhang da zai lai ba";
    }
    else{
        if(t == 1)
        {
            cout << "1: huan ying ru guan";
        }
        else
        {
            cout <<"2: huan ying ru guan";
        }
    }
    return 0;
}

L1-4 拯救外星人

分数 10

T.jpg

你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“5+7”等于多少时,如果你告诉他等于“12!”,他就写出了“479001600”这个答案。

本题就请你写程序模仿外星人的行为。

输入格式:

输入在一行中给出两个正整数 A 和 B。

输出格式:

在一行中输出 (A+B) 的阶乘。题目保证 (A+B) 的值小于 12。

输入样例:

3 6

输出样例:

362880
#include<iostream>

using namespace std;

int main()
{
    int a, b ;
    cin >> a >> b;

    long long res = 1 ;
    for(int i = a + b;i >= 2; i --)
    {
        res *= i; 
    }
    cout <<res;
    return 0;
}

L1-5 试试手气

分数 15

sz.png

我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:

  • 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;

  • 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。

那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。

输入格式:

输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。

输出格式:

在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。

输入样例:

3 6 5 4 1 4
3

输出样例:

4 3 3 3 4 3

样例解释:

这 3 次摇出的结果依次为:

6 5 6 6 6 6
5 4 4 5 5 5
4 3 3 3 4 3
#include<iostream>
#include <cstring>

using namespace std;
int a[7];
bool st[7];
int main()
{    

    for(int i = 1;i <= 6; i ++)
    {
        cin >> a[i];
    }
    int b;
    cin >>  b;
    for(int i = 1; i <= 6; i++ )
    {
        memset(st,0,sizeof st);
        int k = b,cnt = 6;
        st[a[i]] = true;
        while(k)
        {
            if(!st[cnt]){
                st[cnt--] = true;
                k --;
            }else{
                cnt --;
            }
        }
        if(i==6)
        {
            cout << cnt + 1<<endl;;
        }
        else{
            cout << cnt + 1<<" ";
        }
       
    }
    return 0;
}

L1-6 斯德哥尔摩火车上的题

分数 15

tt.png

上图是新浪微博上的一则趣闻,是瑞典斯德哥尔摩火车上的一道题,看上去是段伪代码:

s = ''
a = '1112031584'
for (i = 1; i < length(a); i++) {
  if (a[i] % 2 == a[i-1] % 2) {
    s += max(a[i], a[i-1])
  }
}
goto_url('www.multisoft.se/' + s)

其中字符串的 + 操作是连接两个字符串的意思。所以这道题其实是让大家访问网站 www.multisoft.se/112358注意:比赛中千万不要访问这个网址!!!)。

当然,能通过上述算法得到 112358 的原始字符串 a 是不唯一的。本题就请你判断,两个给定的原始字符串,能否通过上述算法得到相同的输出?

输入格式:

输入为两行仅由数字组成的非空字符串,长度均不超过 104,以回车结束。

输出格式:

对两个字符串分别采用上述斯德哥尔摩火车上的算法进行处理。如果两个结果是一样的,则在一行中输出那个结果;否则分别输出各自对应的处理结果,每个占一行。题目保证输出结果不为空。

输入样例 1:

1112031584
011102315849

输出样例 1:

112358

输入样例 2:

111203158412334
12341112031584

输出样例 2:

1123583
112358
#include<iostream>
#include <cstring>
#include<algorithm>

using namespace std;
int a[7];
bool st[7];
int main()
{    
    string sa;
    string sb;
    string a;
    string b;
    cin >> a >>b;
    for(int i = 1 ; i < a.size(); i ++)
    {
        if((a[i]-'0') % 2 == (a[i-1]-'0') % 2)
        {
            sa += max(a[i],a[i-1]);
        }
    }
    for(int i = 1 ; i < b.size(); i ++)
    {
        // for(int j = i + 1; j < len ; j ++)
        // {
            if((b[i]-'0') % 2 == (b[i-1]-'0') % 2)
            {
                sb += max(b[i],b[i-1]);
            }
        // }

    }
        if(sa == sb)
        {
            cout << sa<<endl;
            return 0;
        }
        else{
            cout << sa <<endl;
            cout << sb <<endl;
        }   
    return 0;
}

L1-7 机工士姆斯塔迪奥

分数 20

在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。

你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。

给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。

输入格式:

输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。

接下来 Q 行,每行两个数 Ti​,Ci​,其中 Ti​=0 表示 BOSS 选择的是一整行,Ti​=1 表示选择的是一整列,Ci​ 为选择的行号/列号。行和列的编号均从 1 开始。

输出格式:

输出一个数,表示安全格子的数量。

输入样例:

5 5 3
0 2
0 4
1 3

输出样例:

12
#include<iostream>
#include <cstring>
#include<algorithm>

using namespace std;

const int N = 1e5+10;

bool sl[N];//hang
bool sr[N];//lie
int main()
{
    long long n,m,q;
    cin >> n >> m >> q;
    long long cnt = 0;
    while(q --)
    {
        int op,k;
        cin >> op >> k;
        if(op == 0)
        {
            if(sl[k]) continue;
            sl[k] = true;
            cnt += m;
            for(int i = 1; i <= m; i++)
            {
                if(sr[i])
                {
                    cnt -= 1;
                }
            }
        }
        else{
            if(sr[k]) continue;
            sr[k] = true;
            cnt += n;
            for(int i = 1; i <= n; i++)
            {
                if(sl[i])
                {
                    cnt -= 1;
                }
            }            
        }
        
    }
    cout << n * m - cnt;
    return 0;
}

L1-8 静静的推荐

分数 20

天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:

  • 只考虑得分不低于 175 分的学生;

  • 一共接受 K 批次的推荐名单;

  • 同一批推荐名单上的学生的成绩原则上应严格递增;

  • 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。

给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?

输入格式:

输入第一行给出 3 个正整数:N(≤105)为参赛学生人数,K(≤5×103)为企业接受的推荐批次,S(≤100)为该企业的 PAT 面试分数线。

随后 N 行,每行给出两个分数,依次为一位学生的天梯赛分数(最高分 290)和 PAT 分数(最高分 100)。

输出格式:

在一行中输出静静姐最多能向企业推荐的学生人数。

输入样例:

10 2 90
203 0
169 91
175 88
175 0
175 90
189 0
189 0
189 95
189 89
256 100

输出样例:

8

样例解释:

第一批可以选择 175、189、203、256 这四个分数的学生各一名,此外 175 分 PAT 分数达到 90 分的学生和 189 分 PAT 分数达到 95 分的学生可以额外进入名单。第二批就只剩下 175、189 两个分数的学生各一名可以进入名单了。最终一共 8 人进入推荐名单。

#include <iostream>
using namespace std;

int cnt[295];

int main ()
{
    int n, k, s;
    cin >> n >> k >> s;

    int ans = 0;
    while (n--)
    {
        int tt, pat;
        cin >> tt >> pat;

        if ( tt >= 175 )
            if ( pat >= s )
                ans++;
            else if ( cnt[tt] < k )
            {
                ans++;
                cnt[tt]++;
            }
    }

    cout << ans;
    return 0;
}

L2-1 插松枝

这题没懂

分数 25

songzhi.jpg

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的:

  • 每人手边有一只小盒子,初始状态为空。

  • 每人面前有用不完的松枝干和一个推送器,每次推送一片随机型号的松针片。

  • 工人首先捡起一根空的松枝干,从小盒子里摸出最上面的一片松针 —— 如果小盒子是空的,就从推送器上取一片松针。将这片松针插到枝干的最下面。

  • 工人在插后面的松针时,需要保证,每一步插到一根非空松枝干上的松针片,不能比前一步插上的松针片大。如果小盒子中最上面的松针满足要求,就取之插好;否则去推送器上取一片。如果推送器上拿到的仍然不满足要求,就把拿到的这片堆放到小盒子里,继续去推送器上取下一片。注意这里假设小盒子里的松针片是按放入的顺序堆叠起来的,工人每次只能取出最上面(即最后放入)的一片。

  • 当下列三种情况之一发生时,工人会结束手里的松枝制作,开始做下一个:

(1)小盒子已经满了,但推送器上取到的松针仍然不满足要求。此时将手中的松枝放到成品篮里,推送器上取到的松针压回推送器,开始下一根松枝的制作。

(2)小盒子中最上面的松针不满足要求,但推送器上已经没有松针了。此时将手中的松枝放到成品篮里,开始下一根松枝的制作。

(3)手中的松枝干上已经插满了松针,将之放到成品篮里,开始下一根松枝的制作。

现在给定推送器上顺序传过来的 N 片松针的大小,以及小盒子和松枝的容量,请你编写程序自动列出每根成品松枝的信息。

输入格式:

输入在第一行中给出 3 个正整数:N(≤103),为推送器上松针片的数量;M(≤20)为小盒子能存放的松针片的最大数量;K(≤5)为一根松枝干上能插的松针片的最大数量。

随后一行给出 N 个不超过 100 的正整数,为推送器上顺序推出的松针片的大小。

输出格式:

每支松枝成品的信息占一行,顺序给出自底向上每片松针的大小。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

8 3 4
20 25 15 18 20 18 8 5

输出样例:

20 15
20 18 18 8
25 5
#include <bits/stdc++.h>
using namespace std;

int n, m, k;
vector<int> v; // 记录每支松枝

int main() {
    cin >> n >> m >> k;
    queue<int> q; // 推送器
    stack<int> stk; // 盒子
    while (n -- ) {
        int x; cin >> x;
        q.push(x);
    }

    while (q.size() || stk.size()) {
        int cnt = 0, last = 1000; // cnt: 当前松针所含松针片数 last:当前松针上最上面的数
        v.clear(); 
        while (cnt < k) { // 开始插松针
            if (stk.size() && stk.top() <= last) { // 如果盒子有松针片并且最上面的松针片<=last
                // cout << stk.top() << ' '; 之所以不直接输出是因为PAT卡空格
                v.push_back(stk.top());
                last = stk.top();
                stk.pop();
                cnt ++;
            }
            else if (q.size()) { // 如果推送器有元素
                int t = q.front();
                if (t <= last) {
                    // cout << t << ' ';
                    v.push_back(t);
                    last = t;
                    q.pop();
                    cnt ++;
                }
                else if (stk.size() < m) { // 盒子未满
                    stk.push(t);
                    q.pop();
                }
                else break; // 栈满了
            }
            else break;
        }
        for (int i = 0; i < v.size(); i ++) { // 输出松枝
            if (i != v.size() - 1) 
                cout << v[i] << ' ';
            else
                cout << v[i];
        }
        cout << endl;
    }

    return 0;
}
作者:L-China
链接:https://www.acwing.com/solution/content/184895/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

L2-2 老板的作息表

分数 25

zcy.png

新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了?

本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。

输入格式:

输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:

hh:mm:ss - hh:mm:ss

其中 hhmmss 分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 00:00:00 到 23:59:59);每个区间间隔至少 1 秒;并且任意两个给出的时间区间最多只在一个端点有重合,没有区间重叠的情况。

输出格式:

按照时间顺序列出时间表中没有出现的区间,每个区间占一行,格式与输入相同。题目保证至少存在一个区间需要输出。

输入样例:

8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00

输出样例:

04:30:00 - 05:30:00
07:10:58 - 07:10:59
09:00:00 - 13:00:00
19:00:00 - 23:59:59
#include <iostream>
#include <algorithm>

using namespace std;

typedef pair<string , string> PSS;

PSS a[1000000];

bool cmp(PSS a,PSS b)
{
    return a.second < b.second;
}

int main ()
{
    int n;
    cin >> n;
    for(int i = 1 ;i <= n; i++)
    {
        // string a,b;
        char r;
        cin >> a[i].first >> r >> a[i].second;
        
    }
    a[0].first = "00:00:00" , a[0].second = "00:00:00";
    
    sort(a + 1,a + 1 + n);
    
    a[n+1].first = "23:59:59" , a[n+1].second = "23:59:59";
    
    for(int i = 0 ;i <= n; i++)
    {
        if(a[i].second != a[i + 1].first)
        {
            cout << a[i].second << " - " << a[i + 1].first<<endl;
            
        }
    }
    
    
    return 0;
}

L2-3 龙龙送外卖

分数 25

龙龙是“饱了呀”外卖软件的注册骑手,负责送帕特小区的外卖。帕特小区的构造非常特别,都是双向道路且没有构成环 —— 你可以简单地认为小区的路构成了一棵树,根结点是外卖站,树上的结点就是要送餐的地址。

每到中午 12 点,帕特小区就进入了点餐高峰。一开始,只有一两个地方点外卖,龙龙简单就送好了;但随着大数据的分析,龙龙被派了更多的单子,也就送得越来越累……

看着一大堆订单,龙龙想知道,从外卖站出发,访问所有点了外卖的地方至少一次(这样才能把外卖送到)所需的最短路程的距离到底是多少?每次新增一个点外卖的地址,他就想估算一遍整体工作量,这样他就可以搞明白新增一个地址给他带来了多少负担。

输入格式:

输入第一行是两个数 N 和 M (2≤N≤105, 1≤M≤105),分别对应树上节点的个数(包括外卖站),以及新增的送餐地址的个数。

接下来首先是一行 N 个数,第 i 个数表示第 i 个点的双亲节点的编号。节点编号从 1 到 N,外卖站的双亲编号定义为 −1。

接下来有 M 行,每行给出一个新增的送餐地点的编号 Xi​。保证送餐地点中不会有外卖站,但地点有可能会重复。

为了方便计算,我们可以假设龙龙一开始一个地址的外卖都不用送,两个相邻的地点之间的路径长度统一设为 1,且从外卖站出发可以访问到所有地点。

注意:所有送餐地址可以按任意顺序访问,且完成送餐后无需返回外卖站

输出格式:

对于每个新增的地点,在一行内输出题目需要求的最短路程的距离。

输入样例:

7 4
-1 1 1 1 2 2 3
5
6
2
4

输出样例:

2
4
4
6
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10 ;
int p[N] , dis[N] , n , m;
// sum 每个点到驿站的边数(边的权重为1)之和 
int sum  ;
// 假设走完所有点回到原点,那么走过的距离就是所有走过的边数 * 2
// 因为我们可以不用回到原点,所以 res = sum * 2 - d(点餐地到原点最大距离)
int dfs(int x){
    if(p[x] == -1 || dis[x] > 0 ) return dis[x] ; 
    sum ++ ;
    dis[x] = dfs(p[x]) + 1 ;
    return dis[x] ;
}

int main()
{
    scanf("%d %d" ,&n , &m) ;
    for(int i = 1; i <= n ; i ++ ) scanf("%d " ,&p[i]) ;

    // mx 点餐地点到驿站的最大距离
    int mx = 0;
    int d ;
    while(m -- ){
        scanf("%d" , &d) ;
        mx = max(dfs(d) , mx) ;
        printf("%d\n" , 2 * sum - mx) ;
    }
    return 0;
}


作者:灰小白
链接:https://www.acwing.com/solution/content/121028/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

L2-4 大众情人

分数 25

qr.jpg

人与人之间总有一点距离感。我们假定两个人之间的亲密程度跟他们之间的距离感成反比,并且距离感是单向的。例如小蓝对小红患了单相思,从小蓝的眼中看去,他和小红之间的距离为 1,只差一层窗户纸;但在小红的眼里,她和小蓝之间的距离为 108000,差了十万八千里…… 另外,我们进一步假定,距离感在认识的人之间是可传递的。例如小绿觉得自己跟小蓝之间的距离为 2,则即使小绿并不直接认识小红,我们也默认小绿早晚会认识小红,并且因为跟小蓝很亲近的关系,小绿会觉得自己跟小红之间的距离为 1+2=3。当然这带来一个问题,如果小绿本来也认识小红,或者他通过其他人也能认识小红,但通过不同渠道推导出来的距离感不一样,该怎么算呢?我们在这里做个简单定义,就将小绿对小红的距离感定义为所有推导出来的距离感的最小值。

一个人的异性缘不是由最喜欢他/她的那个异性决定的,而是由对他/她最无感的那个异性决定的。我们记一个人 i 在一个异性 j 眼中的距离感为 Dij​;将 i 的“异性缘”定义为 1/maxj∈S(i)​{Dij​},其中 S(i) 是相对于 i 的所有异性的集合。那么“大众情人”就是异性缘最好(值最大)的那个人。

本题就请你从给定的一批人与人之间的距离感中分别找出两个性别中的“大众情人”。

输入格式:

输入在第一行中给出一个正整数 N(≤500),为总人数。于是我们默认所有人从 1 到 N 编号。

随后 N 行,第 i 行描述了编号为 i 的人与其他人的关系,格式为:

性别 K 朋友1:距离1 朋友2:距离2 …… 朋友K:距离K

其中 性别 是这个人的性别,F 表示女性,M 表示男性;K(<N 的非负整数)为这个人直接认识的朋友数;随后给出的是这 K 个朋友的编号、以及这个人对该朋友的距离感。距离感是不超过 106 的正整数。

题目保证给出的关系中一定两种性别的人都有,不会出现重复给出的关系,并且每个人的朋友中都不包含自己。

输出格式:

第一行给出自身为女性的“大众情人”的编号,第二行给出自身为男性的“大众情人”的编号。如果存在并列,则按编号递增的顺序输出所有。数字间以一个空格分隔,行首尾不得有多余空格。

输入样例:

6
F 1 4:1
F 2 1:3 4:10
F 2 4:2 2:2
M 2 5:1 3:2
M 2 2:2 6:2
M 2 3:1 2:5

输出样例:

2 3
4
#include<bits/stdc++.h>
using namespace std;
const int N = 510;
int n;
int dist[N][N],sex[N];
int d[N]; //每个人和异性的最大距离
void floyd()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dist[i][j] =  min(dist[i][j],dist[i][k] + dist[k][j]);
            }
        }
    }
}
int main()
{
    cin>>n;
    memset(dist,0x3f,sizeof dist);
    for(int i=1;i<=n;i++)
    {
        dist[i][i] = 0;
        string sexx;int m;cin>>sexx>>m;
        if(sexx == "F") sex[i] = 0;
        else sex[i] = 1;
        for(int j=1;j<=m;j++)
        {
            int a,b;
            scanf("%d:%d",&a,&b);
            dist[i][a] = b; 
        }
    }
    floyd();
    //异性缘最好的人: 对于所有的异性,异性对ta的最大距离值最小
    //找到对于每个人,异性到ta的最大距离
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(sex[i] != sex[j]) 
            {
                d[i] = max(d[i], dist[j][i]);
            }
        }
    }
    int df = 0x3f3f3f3f, dm =  0x3f3f3f3f; //df和dm分别是女性和男性的大众情人的距离值
    for(int i=1;i<=n;i++)
    {
        if(sex[i] == 0) df = min(df,d[i]);
        else if(sex[i] == 1) dm = min(dm,d[i]);
    }
    vector<int> f,m;
    for(int i=1;i<=n;i++)
    {
        if(sex[i] == 0)
        {
            if(d[i] == df) f.push_back(i);
        }
        else if(sex[i] == 1)
        {
            if(d[i] == dm) m.push_back(i);
        }
    }
    for(auto i:f) cout<<i<<' ';
    cout<<'\n';
    for(auto i:m) cout<<i<<' '; 
    cout<<'\n';
    return 0;
}

作者:花酿酒
链接:https://www.acwing.com/file_system/file/content/whole/index/content/11818542/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1602500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间同步服务器的搭建

1.配置server主机&#xff1a; ①server主机的主机名称为 ntp_server.example.com reboot重启 ②server主机的IP为&#xff1a; 172.25.254.100 ③server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 先关闭时间同步服务 设置时间为1984-11-11 11&#xff1a;11&…

vue3父组件使用子组件方法

问题 关于父组件调用子组件方法是比较常见的情况&#xff0c;vue2中使用比较简单&#xff0c;那么vue3 中如何使用呢&#xff1f; 想要的效果&#xff1a; vue2 中调用子组件方法 先看下vue2中如何调用的&#xff0c;代码如下&#xff1a; // child.vue <template>&…

Linux系统的引导过程与服务控制

目录 一、Linux操作系统引导过程 二、Linux系统服务控制 系统初始化进程 三、运行级别切换 *运行级别及切换 Linux系统的运行级别 四、优化开机自动加载服务 五、修复MBR扇区故障 一、Linux操作系统引导过程 主要步骤 开机自检&#xff1a; 检测硬件设备&#…

Matlab软件使用教学

1. Matlab简介 Matlab&#xff08;Matrix Laboratory的缩写&#xff09;是一种由MathWorks公司开发的数值计算和可视化编程环境。它广泛应用于工程、科学研究、数学和教育等领域&#xff0c;因其强大的计算能力和丰富的工具箱而受到青睐。 2. 安装与启动 安装&#xff1a;从M…

Delphi Xe 10.3 钉钉SDK开发——审批流接口(获取表单ProcessCode)

开发钉钉审批流时&#xff0c;需要用到钉钉表单的Processcode&#xff0c;有两种方法 &#xff1a; 一、手动获取&#xff1a; 管理员后台——审批——找到对应的表单&#xff1a;如图&#xff1a; ProcessCode后面就是了&#xff01; 二、接口获取&#xff1a;今天的重点&a…

精致摄影网站模板 Bootstrap4

目录 一.前言 二.展示 三.下载链接 一.前言 这是一个相机摄影网站。网站结构包括以下部分&#xff1a; 导航栏部分&#xff1a;位于页面顶部&#xff0c;包含了Logo和若干导航链接&#xff0c;如Home、About、Gallery、Services、Testimonial和Contact。 横幅部分&#xff…

CSS文本属性与字体属性

目录 文本属性 文本颜色 文本对齐 修饰文本 文本缩进 行高 字体属性 字体系列 字体大小 字体粗细 字体样式 字体/文本综合属性写法 Chrome调试工具的使用 文本属性 文本颜色 在CSS中使用color 属性用于定义文本的颜色&#xff0c;使用background-color设置一个盒…

VUE3 + Elementui-Plus 之 树形组件el-tree 一键展开(收起);一键全选(不全选)

需求&#xff1a; 产品要求权限树形结构添加外部复选框进行全部展开或收起&#xff1b;全选或不全选。 实现步骤&#xff1a; tree组件部分&#xff1a; <div class"role-handle"><div>权限选择(可多选)</div><div><el-checkbox v-mode…

micropython开发与实战阅读笔记

对本文的一些说明 本文来源于阅读《MicroPython开发与实战》时所做的笔记&#xff0c;这本书不是很厚&#xff0c;所以内容也不是很全面&#xff0c;但作为一个入门工具书还是够的&#xff0c;再由于本人不是这方面的大佬&#xff0c;也不是这个专业的&#xff0c;所做的笔记也…

C++ UML 类图介绍与设计

1 类图概述 UML(Unified Modeling Language)&#xff0c;即统一建模语言&#xff0c;是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。UML从目标系统的不同角度出发&#xff0c;定义了用例图、类图、对象图、状态图、活动图…

C++ stl容器list的底层模拟实现

目录 前言&#xff1a; 1.创建节点 2.普通迭代器的封装 3.反向迭代器的封装 为什么要对正向迭代器进行封装&#xff1f; 4.const迭代器 5.构造函数 6.拷贝构造 7.赋值重载 8.insert 9.erase 10.析构 11.头插头删&#xff0c;尾插尾删 12.完整代码简单测试 总结&…

【艾体宝方案】智驾未来:高性能实时数据库,车企的数据分析变革!

近年来&#xff0c;汽车行业持续朝向互联互通以及自动化方向的演进&#xff0c;无论是在优化制造流程、提升车辆安全与性能&#xff0c;还是提供定制化客户体验方面&#xff0c;汽车行业的都未来牢牢根植于其有效处理和利用数据的能力。 一、汽车行业面临的挑战 &#xff08;…

group by 多字段分组查询和 order by

直接看试验步骤就知道了. 表 一.单列group by 执行单列group by语句 SELECT name, COUNT(1) count FROM nomol GROUP BY name 执行结果 我们发现他把原始表分为了两个小组&#xff0c;狗狗小组和猫猫小组。从这可以看出分组查询就是把相同的数据分到一个组 . 二.多列group …

在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?

不要扯那些假大空或是看似高级的技术概念&#xff0c;真正让我感觉到自我提升突飞猛进的是摒弃了码农思维。 先别开骂&#xff0c;我指的码农思维是把自己当代码工人的码农思维。其实程序员本质上就是打工人&#xff0c;无论是掌握了高新技术的程序员&#xff0c;还是在底层摸爬…

MT3026 砍玉米

样例1&#xff1a; 输入&#xff1a; 6 1 3 4 2 5 1 7 8 19 10 30 2 输出&#xff1a; 6 其中1<n<10^5,1<xi,hi<10^9 思路&#xff1a;贪心&#xff1a;从左到右或者从右到左依次判断每一棵玉米是否可以倒下 &#xff08;以从左到右为例&#xff1a;先往左倒&…

Windows版Apache 2.4.59解压直用(免安装-绿色-项目打包直接使用)

windows下Apache分类 Apache分为 安装版和解压版 安装版: 安装方便&#xff0c;下一步------下一步就OK了&#xff0c;但重装系统更换环境又要重新来一遍&#xff0c;会特别麻烦 解压版&#xff08;推荐&#xff09;&#xff1a; 这种方式&#xff08;项目打包特别方便&#x…

c++修炼之路之vector--标准库中的vector

目录 前言 一&#xff1a;vector的简介 二&#xff1a;vector的常用接口 1.构造函数 2.迭代器访问遍历数组 3.容量接口函数 4.增删查改接口函数 三&#xff1a;vector常用接口的全部代码 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗----------…

钉钉OA审批评论接口,如何@ 人并发送通知

钉钉OA审批评论接口&#xff0c;如何 人并发送通 问题描述&#xff1a; 相关接口&#xff1a;https://oapi.dingtalk.com/topapi/process/instance/comment/add 我希望在钉钉oa审批流程中&#xff0c;添加评论的同时通过“”或者其他方式提醒流程发起人去跟进审批工作。 但我…

比起本地渲染,网渲的优势在哪里?渲染100邀请码1a12

网渲的应用很广泛&#xff0c;在建筑设计和室内装修等行业都能看到它的身影&#xff0c;比起本地渲染&#xff0c;它有以下几个优势。 1、资源充足 网渲平台的资源充足&#xff0c;会根据渲染作业的规模和复杂度自动扩展或缩减分配&#xff0c;以达到动态调节的目的&#xff0c…

小米汽车SU7隐藏款曝光!新配色和透明车身亮了 coreldraw教程入门零基础 coreldraw下载 coreldraw2024

刘强东说&#xff0c;论营销&#xff0c;没有任何人能比得过小米。 小米SU7发布会24小时&#xff0c;下定量就超过了蔚来汽车2023年四季度的交付量。 ▲雷军发布的小米SU7 24小时订单量 小米SU7发布会后五天&#xff0c;雷军在北京亦庄工厂亲自交付了第一批创世版本小米SU7&a…