没在现场,不知道能过多少样例:
第一题:
一副扑克牌,总共有 A 2 3 4 5 6 7 8 9 每张牌各4张,从中抽取任意张牌,牌可以有四种出法
现在输入是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; }
第二题:
给出一组 n 个字符串。每个字符串都是小写字母组成,且 ascii 码非递减。
求使用这 n 个字符串,最大能拼接出长度为多少的非递减字符串。
1 <= n <= 10^6
原文:https://www.cnblogs.com/dzzy/p/12536558.html