目录
A.小红大战小紫
题目大意:
解题思路:
AC代码:
B.小红的白日梦
题目大意:
解题思路:
AC代码:
C.小红的小小红
题目大意:
AC代码:
D.小红的中位数
题目大意:
解题思路:
AC代码:
E.小红构造数组
题目大意:
解题思路:
AC代码1:
AC代码2:
总结:
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()
{IOSint 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()
{IOSint 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()
{IOSint 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()
{IOSint 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,目前还不咋会,等过一段学的差不多了再补上