牛客周赛 Round 29
A 小红大战小紫
语法题
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a , b;
cin >> a >> b;
if(a == b)cout << "draw";
else if(a > b)cout << "kou\n";
else cout << "yukari\n";
return 0;
}
B 小红的白日梦
简单贪心能白天就白天
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll n , ans = 0;
cin >> n;
string a , b;
cin >> a;
cin >> b;
for(int i = 0 ; i < n ; i ++){
if(a[i] == 'Y' && b[i] =='Y')ans += 3;
else if(a[i] == 'Y' && b[i] == 'N')ans += 2;
else if(a[i] == 'N' && b[i] == 'Y')ans += 2;
}
cout << ans ;
return 0;
}
C 小红的小小红
贪心,哈希表维护
#include <bits/stdc++.h>
#define ll long long
using namespace std;
map<char , int> m;
int main()
{
string s;
cin >> s;
int n = s.size();
for(int i = 0 ; i < n ; i ++){
m[s[i]]++;
}
m['x']--;
m['i']--;
m['a']--;
m['o']-= 2;
m['h']--;
m['n']--;
m['g']--;
cout << "xiaohong";
for(auto x : m){
for(int i = 0 ; i < x.second ; i ++)cout << x.first;
}
return 0;
}
D 小红的中位数
两个 multiset 维护滑动窗口中的前 K 小值
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
int a[N];
// 两个 multiset 维护滑动窗口中的前 K 小值
struct Magic {
int K;
// st1 保存前 K 小值,st2 保存其它值
multiset<long long> st1, st2;
// sm 表示 st1 中所有数的和
long long sm;
Magic(int K): K(K), sm(0) {}
// 调整 st1 和 st2 的大小,保证调整后 st1 保存前 K 小值
void adjust() {
while (st1.size() < K && st2.size() > 0) {
long long t = *(st2.begin());
st1.insert(t);
sm += t;
st2.erase(st2.begin());
}
while (st1.size() > K) {
long long t = *prev(st1.end());
st2.insert(t);
st1.erase(prev(st1.end()));
sm -= t;
}
}
// 插入元素 x
void add(long long x) {
if (!st2.empty() && x >= *(st2.begin())) st2.insert(x);
else st1.insert(x), sm += x;
adjust();
}
// 删除元素 x
void del(long long x) {
auto it = st1.find(x);
if (it != st1.end()) st1.erase(it), sm -= x;
else st2.erase(st2.find(x));
adjust();
}
};
int main()
{
int n;
cin >> n;
Magic magic((n - 1) / 2);
for(int i = 0 ; i < n ; i ++){
cin >> a[i];
magic.add(a[i]);
}
vector<double> ans;
magic.del(a[0]);
if((n - 1) % 2 == 0)ans.push_back(((double)*prev(magic.st1.end()) + *magic.st2.begin()) / 2);
else ans.push_back((double)*magic.st2.begin());
for(int i = 1 ; i < n ; i ++){
magic.add(a[i - 1]);
magic.del(a[i]);
if((n - 1) % 2 == 0)ans.push_back(((double)*prev(magic.st1.end()) + *magic.st2.begin()) / 2);
else ans.push_back((double)*magic.st2.begin());
}
for(auto x : ans){
printf("%.1lf\n" , x);
}
return 0;
}
E 小红构造数组
1、 分解质因数
2、判断最大数,先不断输出最大数的第二的数直到它俩相等
3、遍历输出
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int n,i;
map<int,int>m;
cin>>n;
if(n==1)return cout<<-1,0;
for(i=2;i*i<=n;i++){
while(n%i==0){
m[i]++;
n/=i;
}
}
if(n>1)m[n]++;
set<pair<int,int>>s;
int sum=0,ma=0;
for(auto i:m){
sum+=i.second;
ma=max(ma,i.second);
s.insert({i.second,i.first});
}
if(ma-1>sum-ma)return cout<<-1,0;
cout<<sum<<'\n';
if(s.size()==1){
cout<<(*(s.begin())).second<<'\n';
return 0;
}
while(sum>0){
auto temp=*s.rbegin();
s.erase(temp);
auto temp2=*s.rbegin();
s.erase(temp2);
if(temp.first!=temp2.first){
cout<<temp.second<<" ";
temp.first--;
if(temp.first){
cout<<temp2.second<<" ";
temp2.first--;
}
else break;
s.insert(temp);
s.insert(temp2);
}
else{
s.insert(temp);
s.insert(temp2);
break;
}
sum--;
}
vector<pair<int,int>>v;
for(auto i:s){
v.push_back(i);
}
while(1){
int jud=0;
for(i=v.size()-1;i>=0;i--){
if(v[i].first){
cout<<v[i].second<<" ";
v[i].first--;
jud=1;
}
}
if(!jud)break;
}
}