牛客周赛 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
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;
}

B.小红的白日梦

题目大意:

白天做梦幸福度+2,晚上做梦幸福度+1,白天和晚上做梦情况可交换。

解题思路:

直接判断两者做梦情况是否相等,不相等则幸福度+2,相等判断是否做梦,做梦则幸福度+3,不做梦则幸福度+0即不处理

AC代码:

#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;
}

C.小红的小小红

题目大意:

给你一个字符串,里面包含”xiao“字符串和”hong“字符串,让你重排一下,出现”xiaohong“即可(比赛时候理解错了,以为让把所有能组成xiaohong的都排一块,麻烦了点,但是能过,算是高质量通过吧)

解题思路:直接用string的库函数查找删除即可

AC代码:

#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"<

D.小红的中位数

题目大意:

给你一个数组,将数组中从i到n的所有数全删一遍,每次删除后,判断当前数组中位数。

解题思路:


另开一个数组记录原数组,再将原数组升序排序,再用map对每个数出现的位置进行标记,最后对数组的长度奇偶进行判断,再将每次删除的数的排序后下标与n/2进行比较,对应输出即可

AC代码:

#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;
}

E.小红构造数组

题目大意:

给你一个数,将他用多少个素数的乘积表示出来,并且相邻两个素数不能相同。

解题思路:

先用分解质因数记录素数的种类和个数,然后利用每次输出最大数量的素数和次大数量的素数来打印,用set集合结合pair实现排序和删除和插入操作,每次输出两个素数的值之后,将他们的数量减一并重新插入,每次插入时都要进行判空,然后直到最后一个单数1(无最大与次大之分,当素数数量为奇数时)直接输出,或者是为偶数2(一个最大一个次大直接)输出完直接结束。(周赛讲解里面讲的方法是先让最大和次大数量相等,然后再依次遍历输出,个人觉得没这个容易理解,AC代码2展示)

AC代码1:

#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;
}

AC代码2:

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

你可能感兴趣的:(c++,算法)