首页 > 其他分享 >天津大学夏令营机试题目

天津大学夏令营机试题目

时间:2023-07-01 12:58:17浏览次数:44  
标签:int 510 len read pop 天津大学 ans 机试 夏令营

首先我没参加机试,所以我都是口胡的做法,大概率能对吧

 

 

 

简单模拟,双指针或者什么的搞一搞,使用getline输入

string s;
int n;
void work()
{
    getline(cin,s);
    n=s.length();
    for(int i=0;i<n;i++)
    {
        int j=i;
        while(j+1<n&&s[j+1]==s[i])
            j++;
        printf("%d%c",j-i+1,s[i]);
        i=j;
    }
    printf("\n");
}
int main() 
{
    // freopen("1.in","r",stdin);
    int t=read();
    getline(cin,s);
    for(;t;t--)
        work();
}
1

2

 

 s和t的范围没给,不妨认为是int范围内

问题是询问数轴上最多有几个区间同时覆盖一个点

那么做法很多,例如离散化后用差分的思想求出每个坐标有几个区间覆盖,取max。我的做法是把左右端点拿出来,sort一下后跑一遍

struct node
{
    int t,f;
    friend bool operator <(node a,node b)
    {
        if(a.t==b.t)
            return a.f>b.f;
        return a.t<b.t;
    }
}o[2000010];
int n,ans,sum;
void work()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        o[i].t=read();
        o[i].f=0;
        o[i+n].t=read();
        o[i+n].f=1;
    }
    sort(o+1,o+1+2*n);
    ans=0;
    for(int i=1;i<=2*n;i++)
    {
        if(o[i].f)
            sum--;
        else
            sum++;
        ans=max(ans,sum);
    }
    printf("%d\n",ans);
}
int main()
{
    // freopen("1.in","r",stdin);
    for(int t=read();t;t--)
        work();

}
2

3

 

 也没给范围,不妨认为(n+m)log(n)跑得过,时间是int范围内正整数

考虑贪心

用大根堆存一下服务器和任务,然后开始枚举服务器,分配任务。(或者你枚举任务分配服务器也是可以的)

int n,m,ans;
priority_queue<int>a,o;
void work()
{
    m=read();n=read();
    while(o.size())o.pop();
    while(a.size())a.pop();
    ans=0;
    for(int i=1;i<=m;i++)
        o.push(read());//服务器
    for(int i=1;i<=n;i++)
        a.push(read());
    while(o.size())
    {
        while(a.size()&&a.top()>=o.top())
            a.pop();
        if(a.size())
            a.pop(),ans++;
        else
            break;
        o.pop();
    }
    printf("%d\n",ans);
}
int main()
{
    // freopen("1.in","r",stdin);
    for(int t=read();t;t--)
        work();

}
3

4

 

 范围又没给,不妨认为nlogn跑得过,元素和k是int范围内

考虑双指针,左端点每移动一次,右端点尽可能地向右移动。区间里的元素用multiset维护,即可log复杂度地插入删除和询问区间元素的最大值最小值之差

int n,k,a[1000010],ans;
multiset<int>o;
void work()
{
    n=read();k=read();
    for(int i=1;i<=n;i++)
        a[i]=read();
    o.clear();ans=0;
    for(int l=1,r=0;l<=n;l++)
    {
        if(l>r)
            o.insert(a[l]),r=l;
        while(r<n&&max(a[r+1],*o.rbegin())-min(a[r+1],*o.begin())<=k)
        {
            r++;
            o.insert(a[r]);
        }
        ans=max(ans,r-l+1);
        o.erase(o.find(a[l]));
    }
    printf("%d\n",ans);
}
int main()
{
    // freopen("1.in","r",stdin);
    for(int t=read();t;t--)
        work();

}
4

 

5

 

 

 暴力做法当然是预处理二维前缀和数组,n^4地枚举矩阵,看看矩阵里的1的数量是不是满的

n^4做不了,我们需要n^3的做法

考虑dp,f[x][y][len]表示以xy为右下角,宽为len的矩阵最高能多高

那么如果x,y-len+1到xy都是1,f[x][y][len]=f[x-1][y][len]+1

如果不都为1,那么f[x][y][len]=0

那么对于xy,随着len增大用一个flag记录是否全1,即可n^3地得到f[x][y][len]。对于每个f[x][y][len],ans=max(ans,f[x][y][len]*len)更新答案

空间大概率会挂,注意到第x行的状态只和第x-1行有关,所以使用滚动数组即可做到空间复杂度n^2

int a[510][510],n,m,f[2][510][510],ans;
int main()
{
    // freopen("1.in","r",stdin);
    n=read();m=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            a[i][j]=read();
    for(int x=1;x<=n;x++)
    {
        for(int y=1;y<=m;y++)
        {
            int flag=1;
            for(int len=1;len<=y;len++)
            {
                flag=flag&a[x][y-len+1];
                if(flag)
                    f[x&1][y][len]=f[x&1^1][y][len]+1;
                else
                    f[x&1][y][len]=0;
                ans=max(ans,len*f[x&1][y][len]);
            }
        }
    }
    cout<<ans;

}
5

 

标签:int,510,len,read,pop,天津大学,ans,机试,夏令营
From: https://www.cnblogs.com/qywyt/p/17519130.html

相关文章

  • 2023年6月29日,测评机试题,Iterator底层,ListIterator底层,LinkedList底层
    1.机试题1、输入一个字符串,判断判断这个字符串是否对称例如abcba算对称abccba也算对称packagecom.wz.test01;importjava.util.Scanner;publicclasstest01{/***输入一个字符串,判断判断这个字符串是否对称*例如abcba算对称abccba也算对称*/......
  • 【华为机试ACM基础#02】从单向链表中删除指定值的节点(熟悉链表的输入方式,虽然说本题可
    从单向链表中删除指定值的节点输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。链表的值不能重复。构造过程,例如输入一行数据为:6212325145722则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩......
  • 2023年大湾区青少年信息学能力提升夏令营开营了
    报名时间:2023年6月1日-2023年7月23日你是否对信息学充满了好奇?是否希望提升自己的编程技能和算法思维?那么,2023年大湾区青少年信息学能力提升夏令营正是你展现才华、探索无限潜能的机会!授课团队阵容强大夏令营的授课团队包括NOI(全国青少年信息学奥林匹克竞赛)金牌教师和钻石教师,他们......
  • (华为机试)扑克牌大小
    扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A、2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):345678910JQKA2jokerJOKER输入两手牌,两手牌之间用"-“连接,每手牌的每张牌以空格分隔,”-"两边没有空格,......
  • 华为OD机试题(A&B卷)真题抽中记录文档(更新到 6 月 10 日)
    @目录本篇博客的价值华为OD机试题⭐⭐......
  • 【NEFU】数据结构阶段二机试代码
    个人拙见,难免有不足之处,望大佬们斧正P1#defineMAXNODE64#include<stdio.h>#include<stdlib.h>typedefstructNode//边的信息{intadjvex;structNode*next;}ArcNode;typedefstructVNode//顶点的信息{intdata;ArcNode*firstarc;}Ve......
  • (华为机试)2. 简单错误记录
    简单错误记录开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。处理:1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)2.超过16个字符的文件名称,只记录文件的最......
  • 复试机试学习
    想要见识一下,如何将数据结构中学习到的数据结构应用到实际中,转化为编程猫狗收容所两个队列分别收容猫和狗,不仅收容他们的信息还要增加进入次序的信息此时队列的元素已经不是简单的整型了#include<queue>#include<cstdio>usingnamespacestd;structAnimal{int......
  • 5.31 保研夏令营第一拒
    保研术语说明:rk:排位,即绩点排名oq:overqualified比如清北大佬投西电寄了,吉大SE没入营,呜呜呜,听说卡rk1,不知道是不是oq了,但是还是很难受,不过幸亏吉大老师安慰我,等9.28之后掉甲给大家推荐一下这位老师!......
  • 【华为机试】单词倒叙
    题目描述:输入单行英文句子,里面包含英文字母,空格以及,.?三种标点符号,请将句子内每个单词进行倒序,并输出倒序后的语句输入描述:输入字符串S,S的长度1≤N≤100输出描述:输出逆序后的字符串。解题思路:遍历给定句子,判断如果字母,则插入到指定位置,如果是指定标点,则追......