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