牛客周赛 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 ;
}