【PTA-训练day21】2022 天梯赛总决赛真题 L1 解析

目录

!L1-088 静静的推荐 - 20 - 贪心 

1、nb做法一

2、贪心 nb map

L1-087 机工士姆斯塔迪奥 - 20 - 二维数组标记

1、正向统计

2、反向标记法  二维数组

3、二维vector

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

L1-085 试试手气 - 15 - 哈希表标记

L1-083 谁能进图书馆 - 10 - 巨恶心的分类讨论

L1-084 拯救外星人 - 10


!L1-088 静静的推荐 - 20 - 贪心 

PTA | 程序设计类实验辅助教学平台

1、nb做法一

  • 如果成绩达标且pat成绩也达标 这些人不需要考虑批次 全部可以额外录取
  • 如果成绩达标 但pat成绩不达标 则这些人在该成绩段的批次内可以被录取
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,k,lim,res=0;
    cin>>n>>k>>lim;
    int num[291]={0};
    while(n--)
    {
        int a,b;
        cin>>a>>b;
        if(a>=175&&b>=lim) res++; //如果这个人两个都达标 则他不管批次 肯定被额外录取
        else if(a>=175)
        {
            num[a]++; //记录批次
            if(num[a]<=k) res++; //如果该批次录取没满 则这个人可以录取
        }
    }
    cout<<res;
}

2、贪心 nb map

  • 哈希表mp存 mp[分数段]={pat分数1,pat分数2……}
  • 每个分数段按pat从小到大排序
  • 如果分数段<175 则这人肯定不录取
  • 如果分数段≥175 res+=min(批次k,该分数段人数) 因为前面的pat分数小 如果要录取的人最多,则这些人按批次走肯定可以走
  • 在k以后,如果该人的pat分数满足标准 则这个人也可以被额外录取

  • 比如mp[189]={0,0,89,95}   k=2  lim=90
  • 前k=2个人可以按批次走 后面的人如果pat成绩>=90 则也可以被录取
  • 比如mp[203]={0}   k=2  lim=90
  • res+=min(k,mp.size())=1
#include <bits/stdc++.h>
#define all(v) (v).begin(),(v).end()
using namespace std;

int main()
{
    int n,k,s;
	cin>>n>>k>>s;
	map<int,vector<int>>mp;
	while(n--)
	{
		int x,y;
		cin>>x>>y;
		mp[x].push_back(y);
	}
	for(auto x:mp)
		sort(all(x.second));
	for(auto x:mp)
	{
		if(x.first<175) continue;
		res+=min(k,(int)x.second.size());
		for(int i=k;i<x.second.size();i++)
		{
			if(x.second[i]>=s)res++;
		}
	}
	cout<<res<<endl;
}

L1-087 机工士姆斯塔迪奥 - 20 - 二维数组标记

1、正向统计

#include <bits/stdc++.h>
using namespace std;
int row[101000],col[101000];
int main()
{
    int n,m,q,res=0,cnt1=0,cnt2=0;
    
    cin>>n>>m>>q;
    
    while(q--)
    {
        int t,x;
        cin>>t>>x;
        if(t==0&&row[x]==0) res+=m,cnt1++,row[x]=1;
        else if(t==1&&col[x]==0) res+=n,cnt2++,col[x]=1;
    }
    cout<<n*m-res+cnt1*cnt2;
}

2、反向标记法  二维数组

如果开成a[N][N] 则有一个点过不了

#include <bits/stdc++.h>
using namespace std;

const int N=1e4+10;

int main()
{
    int n,m,q,res=0;
    cin>>n>>m>>q;
    int a[n+1][m+1]={0};
    while(q--)
    {
        int t,x;
        cin>>t>>x;
        if(t==0) for(int i=1;i<=m;i++) a[x][i]=1;
        else for(int i=1;i<=n;i++) a[i][x]=1;
    }
    for(int i=1;i<=n;i++) 
       for(int j=1;j<=m;j++)
           if(a[i][j]==0) res++;
    cout<<res;
}

3、二维vector

二维vector初始化  a.resize(n+1,vector<int>(m+1,0));

#include <bits/stdc++.h>
using namespace std;

int n,m,q,res=0;
vector<vector<int>> a;

int main()
{
    cin>>n>>m>>q;
    a.resize(n+1,vector<int>(m+1,0));
    while(q--)
    {
        int t,x;
        cin>>t>>x;
        if(t==0) for(int i=1;i<=m;i++) a[x][i]=1;
        else for(int i=1;i<=n;i++) a[i][x]=1;
    }
    for(int i=1;i<=n;i++) 
       for(int j=1;j<=m;j++)
           if(a[i][j]==0) res++;
    cout<<res;
}

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

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string s1,s2;
    string r1,r2;
    cin>>s1>>s2;
    for(int i=1;i<s1.size();i++)
    {
        int a=s1[i]-'0',b=s1[i-1]-'0';
        if(a%2==b%2) 
        {
            int t=max(a,b);
            r1+=t+'0';
        }
    }
    for(int i=1;i<s2.size();i++)
    {
        int a=s2[i]-'0',b=s2[i-1]-'0';
        if(a%2==b%2) 
        {
            int t=max(a,b);
            r2+=t+'0';
        }
    }
    if(r1==r2) cout<<r1;
    else cout<<r1<<endl<<r2;
}

L1-085 试试手气 - 15 - 哈希表标记

PTA | 程序设计类实验辅助教学平台

思路:

ck[6][7] 存6个骰子 1~6点数出现情况

  • 首先标记初始6个骰子的点号
  • 第一次先让不是6的骰子转为6并标记6 是6的骰子转为5并标记5
  • 接着遍历6~1 看哪个没被标记 标记后存入
  • 结束k次循环 输出6个骰子情况
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a[6];
    int ck[6][7]={0};
    for(int i=0;i<6;i++)
    {
        cin>>a[i];
        ck[i][a[i]]++;
    }
    int k;
    cin>>k;
    int n=k;
    while(k--)
    {
        for(int i=0;i<6;i++)
        {
            if(k==n)
                if(a[i]!=6) a[i]=6,ck[i][6]++;
                else a[i]=5,ck[i][5]++;
            else
            {
                for(int j=6;j>=1;j--) 
                    if(ck[i][j]==0)
                    {
                        a[i]=j;
                        ck[i][j]++;
                        break;
                    }
            }
        }
    }
    for(int i=0;i<6;i++) 
    {
        if(i!=0) cout<<" ";
        cout<<a[i];
    }
    
}

L1-083 谁能进图书馆 - 10 - 巨恶心的分类讨论

PTA | 程序设计类实验辅助教学平台

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int limt,fa,q1,q2;
    cin>>limt>>fa>>q1>>q2;
    bool f1=true,f2=true,f3=false,f4=false;
    
    if(q1<limt) f1=false;
    if(q2<limt) f2=false;
    if(q1<limt&&q2>=fa) f3=true;
    if(q1>=fa&&q2<limt) f4=true;
    cout<<q1;
    if((!f1&&!f2)||(q1<limt&&q2<fa)) cout<<"-N ";
    else cout<<"-Y ";
    cout<<q2;
    if((!f1&&!f2)||(q2<limt&&q1<fa)) cout<<"-N"<<endl;
    else cout<<"-Y"<<endl;
    
    if(f3)
        printf("qing 2 zhao gu hao 1");
    else if(f4) 
        printf("qing 1 zhao gu hao 2");
    else if(f1&&f2)
        printf("huan ying ru guan");
    else if(!f1&&!f2)
        printf("zhang da zai lai ba");
    else if(!f1&&f2)
        printf("2: huan ying ru guan");
    else if(!f2&&f1)
        printf("1: huan ying ru guan");
}

L1-084 拯救外星人 - 10

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a,b;
    cin>>a>>b;
    int s=a+b,sum=1;
    while(s>1)
    {
        sum*=s;
        s--;
    }
    cout<<sum;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值