2022团体程序设计天梯赛GPLT2022,L1~L2部分(PTA,L1-081~L1-088,L2-041~L2-044)题解代码&复盘

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022团体程序设计天梯赛GPLT2022,L1~L2部分(PTA,L1-081~L1-088,L2-041~L2-044)题解代码&复盘相关的知识,希望对你有一定的参考价值。

文章目录

概要

  • L1部分:L1-081~L1-088
  • L2部分:L2-041~L2-044
  • L3部分:L3-031~L3-033

L1-081 今天我要赢 (5分)

//希望没人不会做……
#include<bits/stdc++.h>
using namespace std;
int main()
    cout<<"I'm gonna win! Today!\\n";
    cout<<"2022-04-23";
    return 0;

L1-082 种钻石(5分)

//总量/速度即可,向下取整
#include<bits/stdc++.h>
using namespace std;
int main()
    int n, v;  cin>>n>>v;
    cout<<n/v<<"\\n";
    return 0;

L1-083 谁能进图书馆(10分)

//题面较长,理清思路后ifelse即可
#include<bits/stdc++.h>
using namespace std;
int main()
    int x, y, a, b;  cin>>x>>y>>a>>b;
    if(a>=x && b>=x)
        cout<<a<<"-Y "<<b<<"-Y\\n";
        cout<<"huan ying ru guan\\n";
    else if(a<x && b < x)
        cout<<a<<"-N "<<b<<"-N\\n";
        cout<<"zhang da zai lai ba\\n";
    else
        if(a>=x)
            if(a>=y)
                cout<<a<<"-Y "<<b<<"-Y\\n";
                cout<<"qing 1 zhao gu hao 2\\n";
            else
                cout<<a<<"-Y "<<b<<"-N\\n";
                cout<<"1: huan ying ru guan\\n";
            
        else
            if(b>=y)
                cout<<a<<"-Y "<<b<<"-Y\\n";
                cout<<"qing 2 zhao gu hao 1\\n";
            else
                cout<<a<<"-N "<<b<<"-Y\\n";
                cout<<"2: huan ying ru guan\\n";
            
        
    
    return 0;

L1-084 拯救外星人(10分)

//输出a+b的阶乘,直接枚举即可
#include<bits/stdc++.h>
using namespace std;
int main()
    int a, b;  cin>>a>>b;
    int c = a+b, d = 1;
    for(int i = 1; i <= c; i++)d *= i;
    cout<<d<<"\\n";
    return 0;

L1-085 试试手气(15分)

//每次摇出来不同,所以直接654往下排,所以直接-n+1,如果大于当前就再-1即可
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main()
    for(int i = 1; i <= 6; i++)cin>>a[i];
    int n;  cin>>n;
    for(int i = 1; i <= 6; i++)
        if(i!=1)cout<<" ";
        if(6-n+1 > a[i])cout<<6-n+1;
        else cout<<6-n+1-1;
    
    return 0;

L1-086 斯德哥尔摩火车上的题(15分)

//代码都给了,照抄就行了
#include<bits/stdc++.h>
using namespace std;
int main()
    string a, sa="";  cin>>a;
    for(int i = 1; i < a.size(); i++)
        if(a[i]%2==a[i-1]%2)
            sa += max(a[i], a[i-1]);
        
    
    string b, sb="";  cin>>b;
    for(int i = 1; i < b.size(); i++)
        if(b[i]%2==b[i-1]%2)
            sb += max(b[i], b[i-1]);
        
    
    if(sa==sb)cout<<sa<<"\\n";
    else cout<<sa<<"\\n"<<sb;
    return 0;

L1-087 机工士姆斯塔迪奥(20分)

//去掉第1行和第x行对答案的影响是一样的(除非x==1),所以每次n--,m--,最后乘起来即可
#include<bits/stdc++.h>
using namespace std;
int main()
    int n, m, q;  cin>>n>>m>>q;
    set<int>se, se2;
    while(q--)
        int t, c;  cin>>t>>c;
        if(t==0 && !se.count(c))n--,se.insert(c);
        if(t==1 && !se2.count(c))m--,se2.insert(c);
    
    cout<<n*m<<"\\n";
    return 0;

L1-088 静静的推荐(20分)

//gplt175+pat(s)从大到小排个序1次直接推走,剩下pat不够的每个分数都再推k个人即可
#include<bits/stdc++.h>
using namespace std;
int main()
    int n, k, s;  cin>>n>>k>>s;
    int a[300]=0, sum = 0;
    for(int i = 1; i <= n; i++)
        int x, y;  cin>>x>>y;
        if(x>=175 && y>=s)sum++;
        if(x>=175 && y<s)a[x]++;
    
    for(int i = 175; i <= 290; i++)
        if(a[i]==0)continue;
        if(a[i]<=k)sum += a[i];else sum += k;
    
    cout<<sum<<"\\n";
    return 0;

L2-041 插松枝(25分)

//队列(推送器)以及栈(小盒子)模拟
#include<bits/stdc++.h>
using namespace std;

stack<int>st;
queue<int>q;
vector<int>ans[1010];

int main()
    int n, m, k;  cin>>n>>m>>k;
    while(n--) int x;  cin>>x;  q.push(x); 
    int i = 0, lst = 0;
    while(q.size() || st.size())
        lst = (ans[i].size()==0 ? 99999 : ans[i].back());
        if(st.size() && st.top()<=lst) //先用小盒子
            ans[i].push_back(st.top());  st.pop();
        else if(q.size() && q.front()<=lst)//再用推送器
            ans[i].push_back(q.front());  q.pop();
        else if(st.size()<m && q.size())//推送器放到小盒子里
            st.push(q.front());  q.pop();
        else
            i++;//小盒子满了,下一根
        
        if(ans[i].size()==k)i++;
    
    for(int j = 0; j <= i; j++)
        if(ans[j].size()==0)continue;
        for(int k = 0; k < ans[j].size(); k++)
            if(k)cout<<" ";
            cout<<ans[j][k];
        
        cout<<"\\n";
    
    return 0;

L2-042 老板的作息表(25分)

//直接排序,然后输出两个不相邻区间的尾和头即可
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;

struct nodeint h1, m1, s1, h2, m2, s2; a[maxn];
bool cmp(node x, node y)
    if(x.h1 != y.h1)return x.h1<y.h1;
    if(x.m1 != y.m1)return x.m1<y.m1;
    if(x.s1 != y.s1)return x.s1<y.s1;


int main()
    int n;  cin>>n;
    for(int i = 1; i <= n; i++)
        scanf("%d:%d:%d - %d:%d:%d", &a[i].h1, &a[i].m1, &a[i].s1, &a[i].h2, &a[i].m2, &a[i].s2);
    
    a[0].h1 = 0, a[0].m1 = 0, a[0].s1 = 0;
    a[0].h2 = 0, a[0].m2 = 0, a[0].s2 = 0;
    a[n+1].h1 = 23, a[n+1].m1 = 59, a[n+1].s1 = 59;
    sort(a,a+n+2, cmp);
    for(int i = 1; i <= n+1; i++)
        if(a[i].h1==a[i-1].h2 && a[i].m1==a[i-1].m2 && a[i].s1==a[i-1].s2)continue;
        printf("%02d:%02d:%02d - %02d:%02d:%02d\\n", a[i-1].h2, a[i-1].m2, a[i-1].s2, a[i].h1, a[i].m1, a[i].s1);
    
    return 0;

L2-043 龙龙送外卖(25分)

//题意:一棵树上不断加点,求每次加点后访问所有点至少一次的最短距离是多少
//思路:可以贪心,外卖员最后的位置应该在距离外卖站最远的送餐地址。所以最短路程 = 需要经过的边数*2 - max(外卖站到送餐地址)
//每次搜索新增送餐点到外卖站未被标记的点(记忆化)可以实现O(n)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int f[maxn], rt, dep[maxn];
int vis[maxn], tmp; //tmp每次累加就行
void dfs(int u ,int dis)//暴力跑一遍路程
    if(u==rt || vis[u])
        tmp += dis;  return ;
    
    vis[u] = 1;
    dfs(f[u], dis+2);

int calc(int u)//点u到rt的距离
    if(u==rt || dep[u])return dep[u];
    return dep[u] = calc(f[u])+1;

int main()
    int n, m;  cin>>n>>m;
    for(int i = 1; i <= n; i++)
        int x;  cin>>x;  f[i] = x;
        if(f[i]==-1)rt=i;
    
    int mx = 0; //维护当前最大距离
    while(m--)
        int x;  cin>>x;
        dfs(x, 0); //每次从这个点跑就行, 根直接当做普通点处理
        mx = max(mx, calc(x));
        cout<<tmp-mx<<"\\n";
    
    return 0;

L2-044 大众情人(25分)

//用距离感建有向图,Floyd计算全图最短路即可,不知道哪里错了,重写一遍过了
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
const int inf = 1e9+10;
struct nodeint to, d;;
int e[510][510];
int sex[510];
int main()
    ios::sync_with_stdio2023GPLT团体程序设计天梯赛 记录

题解PTA团体程序设计天梯赛L1-023 输出GPLT (20 分) Go语言 | Golang

2022团体程序设计天梯赛

2022团体程序设计天梯赛

2022团体程序设计天梯赛

2022团体程序设计天梯赛