牛客周赛 Round 29(A B C D E)

目录

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()
{
	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,目前还不咋会,等过一段学的差不多了再补上

相关推荐

  1. Round 29 (A-E , c++)

    2024-01-26 17:32:01       42 阅读
  2. 26

    2024-01-26 17:32:01       34 阅读
  3. Round 29(A B C D E)

    2024-01-26 17:32:01       34 阅读
  4. Round 30(A~E)

    2024-01-26 17:32:01       32 阅读
  5. Round31-小白感悟

    2024-01-26 17:32:01       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-26 17:32:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-26 17:32:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-26 17:32:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-26 17:32:01       18 阅读

热门阅读

  1. 【Digester解析XML文件的三种方式】

    2024-01-26 17:32:01       31 阅读
  2. uniapp map自定义气泡窗

    2024-01-26 17:32:01       35 阅读
  3. glog使用方法

    2024-01-26 17:32:01       41 阅读
  4. 如何设计一个可靠UDP

    2024-01-26 17:32:01       29 阅读
  5. Acwing---788.逆序对的数量

    2024-01-26 17:32:01       32 阅读
  6. 常见的网络安全攻击类型

    2024-01-26 17:32:01       40 阅读