小菜鸟的校招路---头条的2019校招编程题

字节跳动

做题过程中一直在补充题目内容,数据范围啥的。。。。
第一题
题目描述:
一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。
球迷选座特性:
1.同球迷群体会选择相邻座位,不同球迷群体选择不相邻的座位。(相邻包括前后相邻、左右相邻、斜对角相邻);
2.给定一个M*N的二位球场,0代表该位置没人,1代表该位置有人,希望输出球队群体个数P,最大的球队群体人数Q。
输入:
第一行,2个数字,M N,使用英文逗号隔开
接下来M行,每行N个数字,使用英文逗号隔开
输出:
一行 ,2数字,P Q
第二行是
输入样例:
10,10
0,0,0,0,0,0,0,0,0,0
0,0,0,1,1,0,1,0,0,0
0,1,0,0,0,0,0,1,0,1
1,0,0,0,0,0,0,0,1,1
0,0,0,1,1,1,0,0,0,1
0,0,0,0,0,0,1,0,1,1
0,1,1,0,0,0,0,0,0,0
0,0,0,1,0,1,0,0,0,0
0,0,1,0,0,1,0,0,0,0
0,1,0,0,0,0,0,0,0,0
输出样例:
6,8
代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn=1005;
int a[maxn][maxn];
int book[maxn][maxn];
int dx[]={0,0,1,-1,-1,-1,1,1};
int dy[]={1,-1,0,0,1,-1,1,-1};
int tot=0,maxsize=0,js;
void dfs(int x,int y)
{
    js++;
    maxsize = maxsize > js ? maxsize:js;
    book[x][y] = 1;
    for(int i=0;i<8;i++){
        int nexx = x+dx[i];
        int neyy = y+dy[i];
        if(a[nexx][neyy]==1)
            if(book[nexx][neyy]==0)
                dfs(nexx,neyy);
   //     if((book[nexx][neyy] ==0) && (a[nexx][neyy]==1))

    }
}
int main()
{
    freopen("zijie.txt","r",stdin);
    int n,m;
    scanf("%d,%d",&n,&m);
    char ch;
    int i,j;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            scanf("%d%c",&a[i][j],&ch);
        }
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            if(a[i][j]==1 && book[i][j]==0){
                js = 0;
                dfs(i,j);
                tot++;
            }
            // maxsize = maxsize > js ? maxsize:js;
        }
    cout<<tot<<","<<maxsize<<endl;
    system("pause");
    return 0;
}

第二题
文章病句标识
题目描述:
为了提高文章质量,每一篇文章(假设全部都是英文)都会有m名编辑审核,每个编辑独立工作,会把觉得有问题的句子通过下标记录下来,比如[1,10],1表示病句的第一个字符,10表示病句的最后一个字符。也就是从1到10个字符组成的句子,是有问题的。
现在需要把多名编辑有问题的句子合并起来,送给总编辑进行最终的审核。比如编辑a指出的病句是[1,10],[32,45];b编辑指出的病句是[5,16],[78,94],那么[1,10]和[5,16]是有交叉的,可以合并成[1,16],[32,45],78,94]
输入描述:
编辑数量m,之后每行是每个编辑的标记的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔
输出描述:
合并后的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔。返回结果是从小到大的递增排列。
输入:
3
1,10;32,45
78,94;5,16
80,100;200,220;16,32
输出:
1,45;78,100;00,220
这道题主要是字符的输入,(注意写入的txt的符号都是英文符号,我居然因为这个傻逼错误。。)这里用结构体数组或者pair都可以。

#include <iostream>
#include <vector>
#include <stdio.h>
#include<stdlib.h>
#include <algorithm>
#include <assert.h>
using namespace std;
struct Mem{
    int a, b;
    Mem(){}
    Mem(int a, int b) :a(a), b(b){}
};
bool cmp(const Mem &one, const Mem &other){
    return one.a < other.a;
}
int main()
{
    FILE *stream1;
    stream1 = fopen("d:\\zijie.txt", "r");
    if(stream1==NULL)
        fprintf(stdout,"error on freopen\n");

    int n, i;
    vector<Mem> err;
    while (fscanf(stream1, "%d", &n)){
        int count = 0;
        char ch, eh;
        int a, b;
        eh = ';';
        for (int i = 0; i < n; i++){
            while (eh != '\n'){
                count++;
                fscanf(stream1,"%d%c%d%c", &a, &ch, &b, &eh);
                err.emplace_back(a, b);
            }
            eh = ';';
        }
        sort(err.begin(), err.end(), cmp);
        for (auto it = err.begin(); it < err.end() - 1;){
            if (it->b >= ((it + 1)->a - 1)){
                if ((it + 1)->b >= (it->b)){
                    it->b = (it + 1)->b;
                }
                it = err.erase(it + 1);
                --it;

            }
            else{ ++it; }
        }
        int i;
        for (i = 0; i < err.size()-1; i++){
            cout << err[i].a << "," << err[i].b << ";";
        }
        cout << err[i].a << "," << err[i].b << endl;


    }
    system("pause");
    return 0;
}

第三题 小a和小b玩一个游戏,有n张卡牌,每张上面有两个正整数x,y。
取一张牌时,个人积分增加x,团队积分增加y。
求小a,小b各取若干张牌,使得他们的个人积分相等。
输入描述:
第一行n
接下来n行,每行两个整数x,y
输出描述:
一行一个整数
表示小a的积分和小b的积分相等的时候,团队积分的最大值。
输入:
4
3 1
2 2
1 4
1 4
输出
10
数据范围:
0 < n < 100
0 < x < 1000
0 < y < 1e6

#include <bits/stdc++.h>
using namespace std;
int x,card[100001],card2[100001],dp[101][120001],sum1=0,sum2=0;
int main()
{
    freopen("jifen.txt","r",stdin);

    cin>>x;
    for(int i=1;i<=x;i++)
    {
        cin>>card[i]>>card2[i];
        sum1+=card[i];//记录一种选择情况的和
     }
     memset(dp,-1,sizeof(dp));//把dp赋值-1,假设现在没有发牌
     dp[0][60000]=0;//当后面的数=60000时,可以循环中保证数组不会越界。因为他们的差=0,所以这种方法成立,赋值0.
     for(int i=1;i<=x;i++)
     {
        for(int j=60000-sum1;j<=60000+sum1;j++)//一个是最小值,一个是最大值
        {
                if(dp[i-1][j]!=-1)//不拿这张牌的情况
                {
                    dp[i][j]=max(dp[i-1][j],dp[i][j]);//查找使公共和最大的情况
                }
                if(dp[i-1][j+card[i]]!=-1)//小A取走这张牌
                {
                    dp[i][j]=max(dp[i-1][j+card[i]]+card2[i],dp[i][j]);//用max函数查找
                }
                if(dp[i-1][j-card[i]]!=-1)//小B取走这张牌
                {
                    dp[i][j]=max(dp[i][j],dp[i-1][j-card[i]]+card2[i]);//三种情况都要算上啊~
                }

         }
     }
    cout<<dp[x][60000];//输出最终的总和
    return 0;
}

第四题 两个长度为n的序列a,b
问有多少个区间[l,r]满足
max(a[l,r]) < min(b[l,r])
即a区间的最大值小于b区间的最小值
数据范围:
n < 1e5
ai,bi < 1e9
输入描述:
第一行一个整数n
第二行n个数,第i个为ai
第三行n个数,第i个为bi
0 <= l <= r < n
输出描述:
一行一个整数,表示答案
输入:
3
3 2 1
3 3 3
输出:
3

第五题 小明在抖音关注了n个主播,每个主播每天的开播时间是固定的,分别在si时刻开始,ti时刻结束。小明无法同时看两个直播。一天被分为m个时间单位。请问小明每天最多能完整观看多少个直播?
输入描述:
第一行一个整数,代表n
第二行一个整数,代表m
第三行空格分隔n*2个整数,代表s,t
输出描述:
一行一个整数,表示答案
输入:
3
10
0 3 3 7 7 0
输出
3
数据范围:
1 <= n <= 10^5
2 <= m <= 10^6
0 <= si,ti < m
https://www.sohu.com/a/163376225_236714
https://blog.csdn.net/gc_cg/article/details/80121719
https://www.jb51.net/article/145700.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值