阿里笔试——春季实习第一场

没在现场,不知道能过多少样例:

第一题:

一副扑克牌,总共有 A 2 3 4 5 6 7 8 9 每张牌各4张,从中抽取任意张牌,牌可以有四种出法

  1. 单张牌,比如说 A
  2. 一对牌,比如说 两个2
  3. 五张牌顺子,比如说 A 2 3 4 5
  4. 六张牌连对,比如说 A A 2 2 3 3

现在输入是10种牌每张牌的个数,如 1 1 1 2 2 2 2 2 1 1 ,指的是这10张牌每张的个数,现在问最少出几次能把牌出完。

此时的解答是3次,出3个顺子可以达到目标。

思路:优先找6连,再找5连,再找对子,再找单张;递归查找,递归返回后还原状态。

#include<iostream>
#include<vector>
#include<map>
using namespace std;
map<int,int>result;
int judge(int leval,int num[])
{
    if(leval==4||leval==3)//六连或五连
    {
        int count=0;
        int start=0;
        for(int i=0;i<10;i++)
        {
            if(num[i]!=0)
            {
                if(count==0)
                    start=i;
                count++;
            }
            if(num[i]==0)
            {
                count=0;
                start=0;
            }
            if(count==leval+2)
                return start;
        }
    }
    if(leval==2||leval==1)
    {
        for(int i=0;i<10;i++)
        {
            if(num[i]>=leval)
                return i;
        }
    }
    return -1;
}
void dfs(int num[],int floor)
{
    int lable=0;
    for(int i=0;i<10;i++)
    {
        //cout<<num[i]<<" ";
        if(num[i]!=0)
            lable=1;
    }
    //cout<<endl;
    if(lable==0)
        result[floor]++;
    
    int tp4=judge(4,num);
    if(tp4!=-1)//存在六连张 从tp4开始
    {
        for(int i=0;i<6;i++)//改变状态
            num[tp4+i]--;
        dfs(num,floor+1);
        for(int i=0;i<6;i++)//还原状态
            num[tp4+i]++;
    }
    int tp3=judge(3,num);
    if(tp3!=-1)//存在五连张 从tp3开始
    {
        for(int i=0;i<5;i++)//改变状态
            num[tp3+i]--;
        dfs(num,floor+1);
        for(int i=0;i<5;i++)//还原状态
            num[tp3+i]++;
    }
    int tp2=judge(2,num);
    if(tp2!=-1)//存在对子 从tp2开始
    {
        num[tp2]-=2;//改变状态
        dfs(num,floor+1);
        num[tp2]+=2;//还原状态
    }
    int tp1=judge(1,num);
    if(tp1!=-1)//存在单张 从tp1开始
    {
        num[tp1]-=1;//改变状态
        dfs(num,floor+1);
        num[tp1]+=1;//还原状态
    }
    return ;
}
int main()
{
    int num[10];
    for(int i=0;i<10;i++)
        cin>>num[i];
    dfs(num,0);
    map<int,int>::iterator it=result.begin();
    cout<<it->first<<endl;
    return 0;
}
View Code

第二题:

给出一组 n 个字符串。每个字符串都是小写字母组成,且 ascii 码非递减。

求使用这 n 个字符串,最大能拼接出长度为多少的非递减字符串。

1 <= n <= 10^6

猜你喜欢

转载自www.cnblogs.com/dzzy/p/12536558.html
今日推荐