Live2D

Is It Rated? 题解

link

Solution

不难看出,对于任何确定性算法官方都能办法卡掉你,所以我们可以选择随机化算法。

不难想到统计一个人的错误率,然后对于每次进行加权,概率选择,这样就不好卡了。但是不是很清楚正确率如何保证这么高的,因为很可能出现集体翻车的情况,或许是官方数据造的比较善良吧。

Code

#include <bits/stdc++.h>
using namespace std;

#define Int register int
#define MAXN 1005

template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
template <typename T> inline void chkmax (T &a,T b){a = max (a,b);}
template <typename T> inline void chkmin (T &a,T b){a = min (a,b);}

char s[MAXN];
int c[2],r[MAXN];

signed main(){
	srand (20050913);
	int n,m;cin >> n >> m;double b = 0.75;
	for (Int t = 1;t <= m;++ t){
		string s;cin >> s;double s1 = 0,s2 = 0;
		for (Int i = 0;i < n;++ i) if (s[i] == '0') s1 += pow (b,r[i]);else s2 += pow (b,r[i]);
		double fuc = rand() * 1.0 / RAND_MAX;
		if (fuc <= s1 * 1.0 / (s1 + s2)) puts ("0");
		else puts ("1");
		int rel;cin >> rel;
		for (Int i = 0;i < n;++ i) r[i] += (s[i] - '0' != rel);
	}
	return 0;
}
posted @ 2022-01-23 20:45  Dark_Romance  阅读(56)  评论(0编辑  收藏  举报