题解 [PR #6] DNA 匹配

传送门

赛时根本没意识到自己写了个完全没有正确性的做法,结果它跑过了 60 pts

发现这个题要输出实数,允许的误差范围还大的离谱啊
交个卡时随机试试?
对于一个随机串 t,它对每个能匹配它的 s,设共有 k 个,产生 1k 的贡献
发现不太对,如果合法答案很少的话可能一共都随不到一个合法的
那么可以对每个 si 只从能匹配它的里面随,然后除以能匹配它的概率
好像对精度没啥要求
复杂度 O(2s,512MiB)(雾

点击查看代码
#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;
}
posted @   Administrator-09  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示