原题链接:登录—专业IT笔试面试备考平台_牛客网
这题一开始没想到dfs,用手去推了qaq。
看到选项关联性这么强,就应该马上用dfs,因为手推搞心态。
1->A 2->B 3-> C. 先枚举,然后判断,不符合要求继续枚举。百度9,10题是选C所以让a[9]=a[10]=3.第十题搜不到就直接当成未知的了。运气比较好,答案直接出现了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f
#define endl '\n'
#define MOD 998244353
#define IOS ios::sync_with_stdio(false);cin.tie(0);
int cnta,cntb,cntc;
int a[15];
int pd(int k){
for(int i=2;i*i<=k;i++){
if(k%i==0) return 0;
}
return 1;
}
void pr(){
for(int i=1;i<=10;i++){
if(a[i]==1) cout<<'A';
else if(a[i]==2) cout<<'B';
else cout<<'C';
}
cout<<" "<<cnta<<" "<<cntb<<" "<<cntc;
cout<<endl;
}//CBABBACCCC
int check(){
cnta=0,cntb=0,cntc=0;
for(int i=1;i<=10;i++){
if(a[i]==1) cnta++;
else if(a[i]==2) cntb++;
else cntc++;
}
int ans1=0;
if(pd(cnta)) ans1++;if(pd(cntb)) ans1++;if(pd(cntc)) ans1++;
if(ans1!=a[1]) return 0;
if(a[2]+1!=cntb) return 0;
if(abs(cnta-cntc)!=4-a[3]) return 0;
if(abs(a[4]-a[3])!=3-a[4]) return 0;
if(a[2]!=a[3]&&a[5]==1) return 0;
if(a[4]!=a[5]&&a[5]==2) return 0;
// if(a[3]!=a[4]&&a[5]==2) return 0; 改成这样就没答案了
if(a[6]!=a[7]&&a[5]==3) return 0;
if(a[6]==1&&cnta-1!=1) return 0;
if(a[6]==2&&cntb-1!=2) return 0;
if(a[6]==3&&cntc-1!=3) return 0;
int ans7=0;
int i=1,j=1;
for(int i=1;i<=10;i++){
int j=i+1;
while(a[i]==a[j]&&j<=10) j++;
ans7=max(ans7,j-i);
}
// for(int i=1;i<=10;i++) cout<<a[i];
// cout<<ans7<<endl;
if(a[7]+1!=ans7) return 0;
return 1;
}
void dfs(int k){
if(k==9){
if(check()) pr();
return;
}
for(int i=1;i<=3;i++){
a[k]=i;
dfs(k+1);
}
}
signed main(){
IOS
a[9]=3,a[10]=3;
dfs(1);
}
//考虑边界了?
//考虑特殊情况?
//考虑输出中间值勘误?