拼多多笔试ak

一二题比较简单

三:贪心+排序
#include<bits/stdc++.h>
using namespace std;
char s[10100];
struct node{
    int val;
    int pos;
}arr[10100];
int vis[15][10100],p;
bool cmp(node x,node y){
    if(abs(x.val-p) == abs(y.val-p)){
        if(x.val == y.val){
            if(x.val < p) return x.pos>y.pos;
            else return x.pos < y.pos;
        }else{
            if(x.val < y.val && x.pos < y.pos){
                return x.pos > y.pos;
            }else if(x.val > y.val && x.pos > y.pos){
                return x.pos > y.pos;
            }else if(x.val < y.val && x.pos > y.pos){
                return x.pos < y.pos;
            }else{
                return x.pos < y.pos;
            }
        }
    }
    return abs(x.val-p) < abs(y.val-p);
}
int ans[15];
char cp[10100];
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    scanf("%s",s);
    for(int i=0;i<n;++i){
        arr[i].pos = i;
        arr[i].val = s[i] - '0';
    }
    int minn = -1;
    for(int i=0;i<=9;++i){
        p = i;
        sort(arr,arr+n,cmp);
        for(int j=0;j<k;++j){
            ans[i] += abs(arr[j].val - i);
        }
        for(int j=0;j<n;++j){
            vis[i][j] = arr[j].pos;
        }
        if(minn == -1) minn = ans[i];
        minn = min(minn,ans[i]);
    }
    cout<<minn<<endl;
    char Ans[10100] = "#";
    for(int i=0;i<=9;++i){
        if(ans[i] == minn){
            strcpy(cp,s);
            int x;
            for(int j=0;j<n;++j){
                if(j < k) {
                    cp[vis[i][j]] = i + '0';
                }
            }
            if(Ans[0] == '#'){
                strcpy(Ans,cp);
            }else if(strcmp(Ans,cp) > 0){
                strcpy(Ans,cp);
            }
        }

    }
    cout<<Ans<<endl;
    return 0;
}

四:n只有1e5,map离散化
然后暴力
数据有点水吧 当时想暴力骗分,结果就过了,可能数据是随机的,没有手造
如果是很多个1 2 1 2 ....这种的,肯定超时
#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e5+7;
map<int,int>mp;
vector<int>vt[maxn];
int s[maxn];
int num[maxn];
int main(){
    int n,k,tot=0;
    scanf("%d%d",&n,&k);
    for(int i=1,p=0;i <= n;++i){
        scanf("%d",&s[i]);
        p++;
        if(mp.count(s[i]) == 0) mp[s[i]] = ++tot;
        if(s[i+1] != s[i]){
            num[i] = p;
            p = 0;
            vt[mp[s[i]]].push_back(i);
        }
    }
    int ans = 0;
    for(int i=1;i<=tot;++i){
        int Size = vt[i].size();
        bool flag = 0;
        for(int j=0;j<Size;++j){
            int tmp = k;
            int sum = 0;
            for(int z=j;z<Size&&tmp>=0;++z){
                sum += num[vt[i][z]];
                if(z != Size - 1) tmp -= vt[i][z+1] - num[vt[i][z]] - vt[i][z];
            }
            ans = max(ans,sum);
        }

    }
    cout<<ans<<endl;
    return 0;
}


#拼多多##笔试题目#
全部评论
小面包??
点赞 回复 分享
发布于 2020-04-10 23:37

相关推荐

05-12 17:28
已编辑
门头沟学院 硬件开发
ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务