目录
A.小红大战小紫
题目大意:
输出胜负还是平局
解题思路:
A>B问题,签到
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[200100];
void solve()
{
int a,b;
cin>>a>>b;
if(a>b){
cout<<"kou"<<endl;
}else if(b>a){
cout<<"yukari"<<endl;
}else{
cout<<"draw"<<endl;
}
return ;
}
signed main()
{
IOS
int t=1;
//cin>>t;
while(t--)
solve();
return 0;
}
B.小红的白日梦
题目大意:
白天做梦幸福度+2,晚上做梦幸福度+1,白天和晚上做梦情况可交换。
解题思路:
直接判断两者做梦情况是否相等,不相等则幸福度+2,相等判断是否做梦,做梦则幸福度+3,不做梦则幸福度+0即不处理
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[200100];
void solve()
{
int n,sum=0;
string x,y;
cin>>n;
cin>>x>>y;
for(int i=0;i<n;i++){
if(x[i]!=y[i]){
sum+=2;
}else if(x[i]=='Y'){
sum+=3;
}
}
cout<<sum<<endl;
return ;
}
signed main()
{
IOS
int t=1;
//cin>>t;
while(t--)
solve();
return 0;
}
C.小红的小小红
题目大意:
给你一个字符串,里面包含”xiao“字符串和”hong“字符串,让你重排一下,出现”xiaohong“即可(比赛时候理解错了,以为让把所有能组成xiaohong的都排一块,麻烦了点,但是能过,算是高质量通过吧)
解题思路:直接用string的库函数查找删除即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int t=s.find("xiao");
s.erase(t,4);
t=s.find("hong");
s.erase(t,4);
cout<<"xiaohong"<<s<<endl;
return 0;
}
D.小红的中位数
题目大意:
给你一个数组,将数组中从i到n的所有数全删一遍,每次删除后,判断当前数组中位数。
解题思路:
另开一个数组记录原数组,再将原数组升序排序,再用map对每个数出现的位置进行标记,最后对数组的长度奇偶进行判断,再将每次删除的数的排序后下标与n/2进行比较,对应输出即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[200100],b[200100];
void solve()
{
int n;
cin>>n;
map<int,int>m;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
m[a[i]]=i;
}
for(int i=1;i<=n;i++){
if(n%2){
int nn=n+1;
if(m[b[i]]<(nn/2)){
printf("%.1lf\n",(a[nn/2]*1.0+a[nn/2+1]*1.0)/2);
}else if(m[b[i]]>(nn/2)){
printf("%.1lf\n",(a[nn/2-1]*1.0+a[nn/2]*1.0)/2);
}else{
printf("%.1lf\n",(a[nn/2-1]*1.0+a[nn/2+1]*1.0)/2);
}
}else{
if(m[b[i]]<(n/2)){
cout<<a[n/2+1]<<".0"<<endl;
}else if(m[b[i]]>(n/2)){
cout<<a[n/2]<<".0"<<endl;
}else{
cout<<a[n/2+1]<<".0"<<endl;
}
}
}
return ;
}
signed main()
{
IOS
int t=1;
//cin>>t;
while(t--)
solve();
return 0;
}
E.小红构造数组
题目大意:
给你一个数,将他用多少个素数的乘积表示出来,并且相邻两个素数不能相同。
解题思路:
先用分解质因数记录素数的种类和个数,然后利用每次输出最大数量的素数和次大数量的素数来打印,用set集合结合pair实现排序和删除和插入操作,每次输出两个素数的值之后,将他们的数量减一并重新插入,每次插入时都要进行判空,然后直到最后一个单数1(无最大与次大之分,当素数数量为奇数时)直接输出,或者是为偶数2(一个最大一个次大直接)输出完直接结束。(周赛讲解里面讲的方法是先让最大和次大数量相等,然后再依次遍历输出,个人觉得没这个容易理解,AC代码2展示)
AC代码1:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
//int a[200100];
void solve()
{
int n,i;
map<int,int>m; //记录每个素因子出现的次数。
cin>>n;
if(n==1){
cout<<-1<<endl;
return ;
}
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){
cout<<"-1"<<endl;
return ;
}
cout<<sum<<endl;
if(s.size()==1){
cout<<(*(s.begin())).second<<endl;
return ;
}
while(sum>0){
if(sum==1){
cout<<(*(s.rbegin())).second<<endl;
return ;
}
auto temp=*s.rbegin();
s.erase(temp);
auto temp2=*s.rbegin();
s.erase(temp2);
if(temp.first!=temp2.first){
cout<<temp.second<<" ";
temp.first--;
cout<<temp2.second<<" ";
temp2.first--;
sum-=2;
if(temp.first)
s.insert(temp);
if(temp2.first)
s.insert(temp2);
}
else{
cout<<temp.second<<" "<<temp2.second<<" ";
temp2.first--;
temp.first--;
if(temp.first)
s.insert(temp);
if(temp2.first)
s.insert(temp2);
sum-=2;
}
}
return ;
}
signed main()
{
IOS
int t=1;
//cin>>t;
while(t--)
solve();
return 0;
}
AC代码2:
#include<bits/stdc++.h>
using namespace std;
#define int long long
// O(sqrt(n))分解n
// O(nlogn) 分解 1到n所有数
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;
}
return 0;
}
总结:
A题基础语法,B题简单模拟,C题字符串的简单使用,D题对中位数结合桶思想,E题考查分解质因数和思维.
F题博弈+概论dp,目前还不咋会,等过一段学的差不多了再补上