题解 [PR #6] DNA 匹配
赛时根本没意识到自己写了个完全没有正确性的做法,结果它跑过了 60 pts
发现这个题要输出实数,允许的误差范围还大的离谱啊
交个卡时随机试试?
对于一个随机串 ,它对每个能匹配它的 ,设共有 个,产生 的贡献
发现不太对,如果合法答案很少的话可能一共都随不到一个合法的
那么可以对每个 只从能匹配它的里面随,然后除以能匹配它的概率
好像对精度没啥要求
复杂度 (雾
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 110
#define ll long long
#define double long double
//#define int long long
int n, m;
int tot;
string s[N], t;
double pro[N], ans;
char c[]={'A','T','G','C'};
inline double qpow(double a, int b) {double ans=1; for (; b; a=a*a,b>>=1) if (b&1) ans=ans*a; return ans;}
signed main()
{
random_device seed;
mt19937 rand(seed());
cin>>n>>m;
for (int i=1; i<=m; ++i) {
cin>>s[i];
int cnt=0;
for (auto& it:s[i]) cnt+=(it!='?');
pro[i]=qpow(0.25, cnt);
}
while (clock()<1800000) {
++tot;
for (int i=1; i<=m; ++i) {
t=s[i];
for (auto& it:t) if (it=='?') it=c[rand()&3];
int cnt=0;
for (int j=1; j<=m; ++j) {
for (int k=0; k<n; ++k) if (s[j][k]!=t[k] && s[j][k]!='?') goto jump;
++cnt;
jump: ;
}
ans+=1.0/cnt*pro[i];
}
}
printf("%.20Le\n", ans/tot);
cerr<<"tot: "<<tot<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!