题解:P10384 「HOI R1」杂交选种
Solution
这道题有点水啊,我没有做任何分析随便写了一个过程交上去
在高中生物学中,隐性个体必然为纯合子,因此如果有某匹马的表型为
对于显性个体是纯合子还是杂合子,最好的判断方法是测交。将个体与
因此,首先特判有个体的表型是隐性性状的情况。
vector<string> check(int flg) {
ffor(i,1,n) if(i!=flg&&op[i]==1) {
ffor(k,1,22) {
++cnt,cross(flg,i);
if(query(cnt)=='a') {gene[i]=1;break;}
}
if(gene[i]!=1) gene[i]=2;
}
vector<string> ans;
ffor(i,1,n) if(gene[i]==0) ans.push_back("aa");
else if(gene[i]==1) ans.push_back("Aa");
else ans.push_back("AA");
return ans;
}
如果所有个体都是显性性状,那么它不是
我们将采取这样的流程:对于个体
生物学的基本知识:如果两个显性个体杂交得到隐性个体,这两个显性个体都是杂合子。
在对第
(执行
交了四五发,没有一发
代码:
#include<bits/stdc++.h>
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=5e5+10;
int cnt,flg,n,op[MAXN],gene[MAXN];
char query(int k);
void cross(int i,int j);
vector<string> check(int flg) {
ffor(i,1,n) if(i!=flg&&op[i]==1) {
ffor(k,1,22) {
++cnt,cross(flg,i);
if(query(cnt)=='a') gene[i]=1;
}
if(gene[i]!=1) gene[i]=2;
}
vector<string> ans;
ffor(i,1,n) if(gene[i]==0) ans.push_back("aa");
else if(gene[i]==1) ans.push_back("Aa");
else ans.push_back("AA");
return ans;
}
vector<string> guess(int N) {
n=N,cnt=n;
ffor(i,1,n) op[i]=(query(i)=='A');
ffor(i,1,n) if(op[i]==0) flg=i;
if(flg) return check(flg);
cross(1,2),++cnt;
if(query(cnt)=='a') return check(cnt);
ffor(i,1,99) {
cross(1,n+i),++cnt;
if(query(cnt)=='a') return check(cnt);
}
//这时候一号是 AA
vector<string> ans;
ans.push_back("AA");
int aid=0;
ffor(i,2,n) {
int flg=0;
if(aid==0) {
cross(1,i),++cnt;
if(query(cnt)=='a') aid=cnt,flg=1;
ffor(j,1,21) {
cross(i,cnt),++cnt;
if(query(cnt)=='a') {aid=cnt,flg=1;break;}
}
if(flg==0) ans.push_back("AA");
else ans.push_back("Aa");
}
else {
ffor(j,1,22) {
cross(aid,i),++cnt;
if(query(cnt)=='a') {flg=1;break ;}
}
if(flg==0) ans.push_back("AA");
else ans.push_back("Aa");
}
}
return ans;
}
PS:稍微思考了一下,好像把第一匹马和其他马分开考虑是没有必要的。懒得改代码了。