今日头条笔试

1#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n, m, c;
    n = m = c = 0;
    cin >> n >> m >> c;
    vector< vector<int> > color(c + 1);
    for (int i = 0; i<c + 1; i++){
        color[i].resize(n, 0);
    }
    int col = 0;
    int tmp = 0;
    for (int j = 0; j<n; j++){
        cin >> col;
        for (int z = 0; z<col; z++){
            cin >> tmp;
            color[tmp][j] = 1;
        }
    }
    int sum = 0;
    for (int i = 1; i<c + 1; i++){
        int sumflag = 0;
        for (int j = 0; j<n; j++){
            for (int z = 0; z<m; z++){
                sumflag += color[i][(j + z) % n];
            }
        }
        if (sumflag/m>1)
            sum++;
    }
    cout << sum;
    return 0;
}
第二种:
#include <iostream>
#include <algorithm>
#include <math.h>
#include <stack> 
#include <string>
#include <set>
using namespace std;


int main(){
    int n,m,c;
    cin>>n>>m>>c;
    int col[51][10000];
    for(int i = 0;i<n;i++){
        //初始化数组;
        for(int j = 0;j<51;j++){
            col[j][i] = 0;
        } 

        int num;//每个位置珠子颜色个数 
        cin>>num;
        for(int j = 0;j<num;j++){
            int color;//珠子颜色
            cin>>color;
            col[color][i] = 1;
        }
    }
    //看位置i的col相隔最小
    int count = 0;//颜色不符合个数 
    for(int i = 1; i<51; i++){
        int begin = 0;
        int mm = n;//相差最小距离 
        int p = 0; 
        bool flag = 0;
        for(int j = 0; j<n; j++){
            if(col[i][j] == 1){
                if(flag == 0){
                    flag = 1;
                    begin = j;//第一个位置 
                    p = j;
                }
                else{       
                    mm = min(mm, j-p);          
                    p = j;

                }
            }                                   
        }
        mm = min(mm, n+begin-p);
        if(mm<m){
            count++;
        }
    } 
    cout<<count;
    return 0;
}

2、

#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
const int N = 300003;
struct P{
    int l, r, k, id;

}p[N];

int f[N];
int ans[N];
map<int, int>mp;

bool cmp(P x, P y){
    return x.l < y.l;
}
int main(){
    int n, Q;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d" ,&f[i]);
    }
    scanf("%d", &Q);
    for(int i = 1; i <= Q; i++){
        scanf("%d%d%d",&p[i].l, &p[i].r, &p[i].k);
        p[i].id = i;
    }
    p[0].r = 0;
    sort(p + 1, p + Q + 1, cmp);
    int nowL = 0, nowR = 0;
    for(int i = 1; i <= Q; i++){

        int l = p[i].l;
        int r = p[i].r;
        if(l >= p[i-1].r){
            mp.clear();
            for(int j = p[i].l; j <= p[i].r; j++){
                mp[f[j]] ++;
            }
            nowL = p[i].l; nowR = p[i].r;
        }else{
            while(nowL < l){
                mp[f[nowL]] --;
                nowL ++;
            }
            while(nowR < r){
                nowR ++;
                mp[f[nowR]] ++;
            }
        }
        ans[p[i].id] = mp[p[i].k];
    }
    for(int i = 1; i <= Q; i++){
        printf("%d\n", ans[i]);
    }
    return 0;
}
/*
5
1 2 3 3 5
3
1 2 1
2 4 5
3 5 3
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值