滴滴 9.17笔试 凉经

第一题:
一个标书证书的字符串,其中有几位是问号,知道这个数字满足
1,可被3整除;2,相邻数字不同;3,首位不为0
问这个数字最小是多少
直接贪心+回溯 ac
bool f(string& str, int index, int pre){
    if(index==str.size()){
        return pre==0;
    }
    if(str[index]=='?'){
        char before=(index==0)?'0':str[index-1];
        char after=(index+1==str.size())?'*':str[index+1];
        for(int i=0;i<9;i++){
            char c='0'+i;
            if(c!=before && c!=after){
                str[index]=c;
                int left=(pre*10+i)%3;
                if(f(str,index+1,left)) return true;
                //str[index]='?';
            }
        }
        str[index]='?';
    }else{
            int left=(pre*10+str[index]-'0')%3;
            return f(str, index+1,left);
    }
    return false;
}

int main(){
    string str;
    cin>>str;
    f(str, 0, 0);
    cout<<str<<endl;
    return 0;
}

第二题:
n个栅栏,每个栅栏被涂上两种漆,每次在【l,r】区间上(左闭右闭)涂一种漆,当第一种漆涂至少p次,第二种漆涂之撒后q次时这个栅栏才是正常。问给定一系列区间,有多少个栅栏是正常的。
经典的排序+贪婪。但是问题是要考虑端点,因为全是比区间,我就是栽在这上面了。。。。后来刚改完就交卷了,服了
int main(){
    int n,p,q;
    cin>>n>>p>>q;
    vector<vector<int>> points(2*n, vector<int>(3,0));//[index, type, add/delete]
    for(int i=0;i<n;i++) {
        cin>>points[i][0];
        points[i][2]=1;
    }
    for(int i=n;i<2*n;i++) {
        cin>>points[i][0];
        points[i][2]=-1;
    }
    for(int i=0;i<n;i++){
        int type;
        cin>>type;
        points[i][1]=type;
        points[i+n][1]=type;
    }
    //for(auto& v:points) cout<<v[0]<<", "<<v[1]<<", "<<v[2]<<endl;
    sort(points.begin(), points.end());
    //cout<<"====="<<endl;
    //for(auto& v:points) cout<<v[0]<<", "<<v[1]<<", "<<v[2]<<endl;
    int type1=0,type2=0;
    int pre=points[0][0];
    if(points[0][1]==1){
        type1=points[0][2];
    }else{
        type2=points[0][2];
    }
    int result=0;
    for(int i=1;i<points.size();){
        cout<<i<<endl;
        int index=points[i][0],type=points[i][1];
        int type1_add=0,type1_minux=0,type2_add=0,type2_minux=0;
        if(type1>=p && type2>=q){
            result+=index-pre;
        }
        cout<<index<<type1<<", "<<type2<<endl;
        while(i<points.size() && points[i][0]==index){
            if(points[i][1]==1){
                if(points[i][2]>0){
                    type1_add++;
                }else{
                    type1_minux++;
                }

            }else{
                if(points[i][2]>0){
                    type2_add++;
                }else{
                    type2_minux++;
                }
            }
            i++;
        }
        type1+=type1_add;
        type2+=type2_add;
        if(type1>=p && type2>=q) result++;
        
        type1-=type1_minux;
        type2-=type2_minux;
        pre=index+1;
    }
    cout<<result;
    return 0;
}
感觉出这种类型的题应该滴滴可能也不太想招人。但是我还是没ac。。最近一直是在上机的时候考虑问题不仔细,临要弄完了就才想明白。。。心态崩了


#滴滴笔试#
全部评论
为什么9不取等于?
点赞 回复 分享
发布于 2022-09-17 23:04 湖南
同学同花顺尝试一下吗,面试简单不造火箭,我帖子有内推
点赞 回复 分享
发布于 2022-09-18 01:14 浙江
不如试试小而美公司优***?全球领先的IoT行业数字化解决方案提供商,四大体系岗位,专业不限,流程高效,不泡池子不养鱼,投递链接http://campus.51job.com/urovo/ 内推码:LSWUZH
点赞 回复 分享
发布于 2022-09-18 21:11 广东

相关推荐

评论
1
1
分享
牛客网
牛客企业服务