首页 > 8.31 拼多多笔试
头像
徐四
发布于 2021-08-31 21:03
+ 关注

8.31 拼多多笔试

第一题
其实应该写应该while就行了,但是一开始写匈牙利做二分图匹配炸了,就写的有点崩
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10005;
int n,m,k,T;
int a[maxn],b[maxn];
int vis[maxn],match[maxn];
int main() {
    cin>>T;
    while(T--) {
        int ans1=0,ans2=0;
        cin>>n>>m>>k;
        for(int i=0;i<n;i++){cin>>a[i];}
        for(int i=0;i<m;i++){cin>>b[i];}
        sort(a,a+n);sort(b,b+m);
        int a1=0,b1=0;
        while(a1<n && b1<m) {
            if(b[b1]-k<=a[a1] && a[al]<=b[b1]+k) {
                b1++,a1++;
                ans1 ++;
            }
            else if(b[b1]-k>a[a1] ) a1++;
            else if(a[al]<b[b1]+k) b1++;
        }
        while(a2<n && b2<m) {
            if(a[a2]-k<=b[b2] && b[b2]<=a[a2]+k) {
                b2++,a2++;
                ans2 ++;
            }
            else if(a[a2]-k>b[b2]) b2++;
            else if(b[b2]>a[a2]+k)a2++;        
        }
        printf("%d\n",max(ans1,ans2));
    }

    return 0;
}
第二题
排序就不找了

第三题
推出来边长L的正方形需要2*L^2+2*L,然后懒得倒推 ,估计之后的部分数字不大
就直接模拟完事了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 10005;
int T;
#define ll long long
ll n;
int main() {
    cin>>T;
    while(T--) {
        cin>>n;
        if(n<4){
            printf("0\n");
            continue;
        }
        ll L = sqrt(n/2)-1;
        ll ans =  L*L;
        n -= 2*(L+1)*L;
        while(n>0) {
            if(n>=3)ans++,n-=3;
            else break;
            if(n>=2*L-2){
                ans +=L-1;
                n-=2ll*L-2;
            }
            else {
                ans+=n/2;break;
            }
            if(n>=3)ans++,n-=3;
            else break;
            if(n>=2*L){
                ans +=L;
                n-=2ll*L;
                L++;
            }
            else {
                ans+=n/2;break;
            }
        }
        printf("%lld\n",ans);
    }
    return 0 ;
}

第四题
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10005;
int T,n,a[maxn];
int f(int l,int r) {
    if(l==r)return 1;
    int minn = 1e9;
    for(int i=l;i<=r;i++)minn = min(minn,a[i]);
    for(int i=l;i<=r;i++)a[i]-=minn;
    int ans1 = minn ,lc=l,rc=l;
    while(lc<=r) {
        if(a[lc]==0)lc++;
        else {
            rc = lc;
            while(rc<=r &&a[rc]!=0)rc++;
            rc -- ;
            ans1+=f(lc,rc);
            lc = rc+1;
        }
    }
   // printf("L%d R%d %d %d\n",l,r,ans1,r-l+1);
    return min(ans1,r-l+1);
}
int main() {
    cin>>T;
    while(T--) {
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        int ans = f(1,n);
        printf("%d\n",ans);
    }

    return  0;
}


全部评论

(5) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐