美团codeM比赛

本文提供了三道不同难度级别的编程题目的解决方案,包括简单的数组比较、中等难度的数据轮次淘汰赛以及一道较为复杂的区间更新查询题目。每道题都附带了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. 暴力签到

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e4;
int a[maxn], b[maxn];
int n,m;
int main()
{
    cin >> n;
    for(int i = 0; i < n ; i++)
        cin >> a[i];
    cin >> m;
    for(int i = 0; i < m; i++)
        cin >> b[i];

    int ans = inf;
    for(int i = 0; i <= m-n ; i++)
    {
        int th = 0;
        for(int j = 0; j < n ;j++)
            th += (a[j]-b[i+j])*(a[j] - b[i+j]);
        ans = min(th,ans);
    }
    cout << ans << endl;
    return 0;
}


B.思维题,记录小于第一个数据的有多少个,然后看他们能比多少轮

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
const int inf = 0x3f3f3f3f;


int n,m;
int main()
{
    int xm,d;
    scanf("%d",&n);
    scanf("%d",&xm);
    int num = 1;
    for(int i = 1; i < n ; i++)
    {
        scanf("%d",&d);
        if(d <= xm) num++;
    }
    int ans = 0;
    while(num)
    {
        num/=2;
        if(num == 0) break;
        ans++;
    }
    printf("%d\n",ans);
    return 0;
}

C.这道题想了好久。。。。

#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

#define met(a,b) memset(a,b,sizeof(a))

const int maxm = 5e5 + 10;
const int maxn = 5e5 + 10;
int sum[maxm << 2], flag[maxn] , last[maxn][2];
int M;
void add(int ti, int v, int id, int l, int r)
{
    if(l == r && l == ti) {sum[id] = v; return;}
    if(ti < l || ti > r) return;
    int m = l+r>>1;

    if(ti <= m) add(ti, v, id << 1, l, m);
    else add(ti, v, id << 1 | 1, m + 1, r);

    sum[id] = sum[id << 1] + sum[id << 1 | 1];
}
int q(int ql, int qr, int id, int l, int r)
{
    if(qr < l || r < ql) return 0;
    if(l >= ql && r <= qr)  return sum[id];

    int m = l+r>>1;
    int ans = 0;
    if(ql <= m) ans += q(ql, qr, id << 1, l, m);
    if(qr >  m) ans += q(ql, qr, id << 1 | 1, m+1,r);

    return ans;
}
int ex = 0;
int ch(int id, int l, int r,int ql,int qr)
{
    if(ql > r || qr < l) return 0;
    if(l == r){ sum[id] = 0;ex = l; return 1;}
    int m = l+r >> 1;
    if(qr <= m) ch(id << 1, l, m, ql, qr);
    else if(ql > m) ch(id <<1|1 , m+1 ,r , ql, qr);
    else
    {
        if(sum[id << 1])
        {
            if(ch(id<<1, l, m, ql, m) == 0)
                ch(id<<1|1, m+1 ,r , m+1, qr);
        }
        else if(sum[id<<1|1])
            ch(id<<1|1, m+1 ,r , m+1, qr);
    }

    sum[id] = sum[id<<1] + sum[id<<1|1];
    return 1;
}
int main()
{
    //freopen("D://in.txt","r", stdin);
    while(~scanf("%d",&M))
    {
        if(M == 0){printf("-1\n"); continue; }

        met(sum, 0); met(flag , 0); met(last, 0);
        int ans = -1;
        for(int i = 1; i <= M; i++)
        {
            char s[2]; int d;
            ex = 0;
            scanf("%s",s);
            if(s[0] == '?')
                add(i,1,1,1,M);
            else
            {
                scanf("%d",&d);

                if(ans != -1) continue;
                if(s[0] == 'O')
                {
                   if(flag[d]) flag[d] = 0, last[d][1] = i;
                    else
                    {
                        int tnum = q(last[d][1], i, 1, 1, M);
                        if(tnum == 0) {ans = i; continue;}
                        else{ch(1,1,M,last[d][1],i); last[d][0] = ex; last[d][1] = i;}
                    }
                }
                else
                {
                    if(flag[d] == 0) flag[d] = 1 , last[d][0] = i;
                    else
                    {
                        int tnum = q(last[d][0], i , 1 , 1 , M);
                        if(tnum == 0) {ans = i; continue;}
                        else
                        {
                            ch(1,1,M,last[d][0],i);
                            last[d][1] = ex;
                            last[d][0] = i;
                        }
                    }
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值