牛客周赛 Round 29

牛客周赛 Round 29

A小红大战小紫

分析

简单比较大小即可

代码

点击查看代码
void solve () {
    int a, b; cin >> a >> b;
    if (a > b) cout << "kou" << endl;
    else if (a == b) cout << "draw" << endl;
    else cout << "yukari" << endl;
    return ;
}

B小红的白日梦

分析

简单分类

代码

点击查看代码
void solve () {
    int n; cin >> n;
    string s, t; cin >> s >> t;
    map<int, int> mp;
    int ans = 0;
    for (int i = 0; i < n; i ++) {
    	if (s[i] == 'Y') {
    		if (t[i] == 'Y') mp[i] = 3;
    		else mp[i] = 2;
    	} else {
    		if (t[i] == 'Y') mp[i] = 2;
    		else mp[i] = 0;
    	}
    	ans += mp[i];
    }
    cout << ans << endl;
    return ;
}

C小红的小小红

分析

按题意模拟

代码

点击查看代码
void solve () {
    string s; cin >> s;
    map<char, int> mp;
    int n = s.size();
    for (int i = 0; i < n; i ++) 
    	mp[s[i]] ++;
    cout << "xiaohong";
    mp['x'] --;
    mp['i'] --;
    mp['a'] --;
    mp['o'] -= 2;
    mp['h'] --;
    mp['n'] --;
    mp['g'] --;
    for (char ch = 'a'; ch <= 'z'; ch ++)
    	for (int cn = 0; cn < mp[ch]; cn ++)
    		cout << ch;
    cout << endl; 
    return ;
}

D小红的中位数

分析

分析一下删除元素对于中位数在删除前后的位置变化即可

代码

点击查看代码
void solve () {
    int n; cin >> n;
    vector<PII> a(n + 1);
    vector<int> pos(n + 1);
    for (int i = 1; i <= n; i ++) {
    	cin >> a[i].fi;
    	a[i].sc = i;
    }
    sort(a.begin() + 1, a.end());
    for (int i = 1; i <= n; i ++) 
    	pos[a[i].sc] = i;
    if (n & 1) {
    	for (int i = 1; i <= n; i ++) {
    		if (pos[i] < (n + 1) / 2) printf("%.1f\n", (a[(n + 1) / 2].fi + a[(n + 1) / 2 + 1].fi) / 2.0);
    		else if (pos[i] == (n + 1) / 2) printf("%.1f\n", (a[n / 2].fi + a[(n + 1) / 2 + 1].fi) / 2.0);
    		else printf("%.1f\n", (a[n / 2].fi + a[(n + 1) / 2].fi) / 2.0);
    	}
    } else {
    	for (int i = 1; i <= n; i ++) {
    		if (pos[i] > n / 2) printf("%.1f\n", a[n / 2].fi * 1.0);
    		else printf("%.1f\n", a[n / 2 + 1].fi * 1.0);
    	}
    }
    return ;
}

E小红构造数组

分析

分解质因数,分解完之后按数量大小排序,优先放数量多的

代码

点击查看代码
void solve () {
    ll n, s = 0; cin >> n;
    vector<PLL> pr;
    if (n == 1) {
    	cout << -1 << endl;
    	return ;
    }
    for (ll i = 2; i <= n / i; i ++) {
    	 if (n % i == 0) {
    	 	ll cn = 0;
    	 	while (n % i == 0) {
    	 		n /= i;
    	 		cn ++;
    	 	}
    	 	s += cn;
    	 	pr.pb({cn, i});
    	 }
    }
    if (n > 1) pr.pb({1, n}), s ++;
    sort(pr.begin(), pr.end(), greater<PLL>());
    vector<ll> ans(s + 1);
	int p = 0;
    for (int i = 1; i <= s; i += 2) {
    	ans[i] = pr[p].sc;
    	if (-- pr[p].fi == 0) p ++;
    }
    for (int i = 2; i <= s; i += 2) {
    	ans[i] = pr[p].sc;
    	if (-- pr[p].fi == 0) p ++;
    }
    for (int i = 1; i < s; i ++) {
    	if (ans[i] == ans[i + 1]) {
    		cout << -1 << endl;
    		return ;
    	}
    }
    cout << s << endl;
    for (int i = 1; i <= s; i ++) cout << ans[i] << ' ';
    cout << endl;
    return ;
}

F小红又战小紫

分析

概率dp,因为值域为2,当存在2的时候,如果本轮的人使用技能2,那么所有的1变为0,所有的2变为1,下一轮自己就输掉,因此当存在2的时候不可能使用技能2。
因为肯定是通过若干次操作一到达没有2的情况再使用一次操作二,我们只考虑操作一。如果现在总共有i堆不为0的石子,j堆为2的石子,那么i-j堆为1的石子,此情况下先手赢的概率为dp[i][j],可以转移到dp[i - j - 1][j]和dp[i - j + 1][j - 1],我们只需要将i从小到大跑一遍即可。

代码

点击查看代码
const int N = 1010;

ll qmi(ll a, ll p){
	ll res = 1;
	while(p) {
		if (p & 1) res = res * a % mod;
		a = a * a % mod;
		p >>= 1;
	}
	return res;
}
ll dp[N][N];

void solve () {
	int n; cin >> n;
	int cn = 0;
	for (int i = 1; i <= n; i ++) {
		int x; cin >> x;
		cn += (x == 2);
	}
	for (int i = 0; i <= n; i ++) {
		dp[i][0] = 1;
		for (int j = 1; j <= i; j ++) {
			dp[i][j] = (i - j) * qmi(i, mod - 2) % mod * ((1 - dp[i - 1][j] + mod) % mod) % mod;
			dp[i][j] += j * qmi(i, mod - 2) % mod * (1 - dp[i][j - 1] + mod) % mod;
			dp[i][j] %= mod;
		}
	}
	cout << dp[n][cn] << endl;
    return ;
}
posted @ 2024-01-27 14:55  ComistryMo  阅读(0)  评论(0)    收藏  举报