首页 > 其他分享 >牛客周赛 Round 35

牛客周赛 Round 35

时间:2024-03-04 20:13:34浏览次数:15  
标签:std int 35 牛客 vector solve long Round define

牛客周赛 Round 35

比赛链接

小红的字符串切割

思路

一遍循环遍历就可以了,到中间位置时候输出一个换行符

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
#define ct(x) cout<<x<<endl

void solve(){
	string s;
	cin>>s;
	for(int i=0;i<s.size();i++){
		if(i==s.size()/2){
			cout<<endl;

		}
		cout<<s[i];
	}
	return ;
	
}

signed main(){
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int t=1;
	// cin>>t;
	
	while(t--){
		solve();
	}
	return 0;

}

小红的数组分配

思路

很明显我们需要保证每个元素出现的个数都是2的倍数,否则就没办法构成

Code

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define all(x) x.begin(),x.end()

void solve(){
	int n;
	cin>>n;
	std::vector<int> a(n*2+1);
	n*=2;
	std::map<int, int> mp;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mp[a[i]]++;
	}
	std::vector<int> v;
	for(auto x:mp){
		if(x.second%2==0){
			int ans=x.second/2;
			while(ans--){
				v.push_back(x.first);
				
			}
		}
		else{
			cout<<-1<<endl;
			return ;
		}
	}
	for(int i=0;i<v.size();i++){
		cout<<v[i]<<" ";
	}
	cout<<endl;

	for(int i=0;i<v.size();i++){
		cout<<v[i]<<" ";
	}
	return ;
}

signed main(){
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int t=1;
	// cin>>t;
	
	while(t--){
		solve();
	}
	return 0;

}

小红关鸡

思路

有意思的问题,看到这个问题我第一时间是想到用二分去做,但是貌似大佬有更好的办法???

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()

void solve(){
	int n,k;
	cin>>n>>k;
	std::vector<int> a(n+1);
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(all(a));
	int ans=1e9+10;
	std::vector<int> b(n+1),c(n+1);
	for(int i=1;i<=n;i++){
		int x=a[i]+k;
		int l=0,r=n;
		while(l<r){
			int mid=(l+r)/2;
			if(a[mid]>x){
				r=mid;
			}
			else{
				l=mid+1;
			}
		}
		
		// cout<<l<<" "<<endl;
		if(a[l]<=x){
			b[i]=i-1;
		}
		else{
			b[i]=i-1+(n-l+1);
		}
		// cout<<b[i]<<" ";
		
		
		
	}
	for(int i=1;i<=n;i++){
		int x=a[i]-k;
		int l=1,r=n;
		while(l<r){
			int mid=(l+r+1)/2;
			if(a[mid]<x){
				l=mid;
			}
			else{
				r=mid-1;
			}
		}
		// cout<<r<<" ";
		if(a[r]>=x){
			c[i]=n-i;
		}
		else{
			c[i]=n-i+(r-1+1);
		}
		// cout<<c[i]<<" ";
	}
	for(int i=1;i<=n;i++){
		ans=min(ans,min(b[i],c[i]));

	}
	// cout<<ans<<endl;
	printf("%.8lf",1-(1.0*ans)/(n*1.0));
}

signed main(){
	int t=1;
	while(t--) solve();

	return 0;

}

小红的排列构造

思路

用一个map处理一下就可以了,记录一下每个数字出现个数,对于出现多次以及不是该区间的数字将他们的位置进行存储,到时候将缺失的存进去就可以了

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin(),x.end()

void solve(){
    int n;
    cin>>n;
    std::map<int, int> mp;
    std::vector<int> g;
    std::vector<int> a(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        // s.insert(a[i]);
        mp[a[i]]++;
        // g[a[i]].push_back(i);
        if(mp[a[i]]>=2||a[i]>n){
            g.push_back(i);
        }

    }
    std::vector<int> v;
    for(int i=1;i<=n;i++){
        if(mp[i]==0){
            v.push_back(i);
        }
    }
    if(v.size()==0){
        cout<<0<<endl;
        return ;
    }
    else{
        cout<<v.size()<<endl;
        
        for(int i=0;i<v.size();i++){
            cout<<g[i]<<" "<<v[i]<<endl;
        }
    }



}

signed main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);
    int t=1;
    // cin>>t;
    
    while(t--){
        solve();
    }
    return 0;

}

小红的无向图构造

Code

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f3f3f3f3f
#define int long long
#define all(x) x.begin()+1,x.end()
#define debug(x) cout<<" # "<<x<<endl
typedef pair<int,int> PII;
void solve(){
    int n,m;
    cin>>n>>m;
    std::vector<int> a(n+2);
    std::vector<int> g[n+2];
    int minn=INF,maxn=-INF;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        g[a[i]].push_back(i);
        maxn=max(maxn,a[i]);
        minn=min(minn,a[i]);
    }
    if(m<n-1){
        cout<<-1<<endl;
        return ;
    }
    for(int i=minn;i<=maxn;i++){
        if(!g[i].size()){
            cout<<-1<<endl;
            return ;
        }

    }
    int mod=m-(n-1);
    std::vector<PII> ans;
    for(int i=1;i<=n;i++){
        for(auto p:g[i]){
            ans.push_back({p,g[i-1][0]});
            int j=1,l=g[i-1].size();
            while(mod&&j<l){
                ans.push_back({p,g[i-1][j++]});
                mod--;

            }
        }
        int k=g[i].size();
        for(int j=0;j<k&&mod;j++){
            for(int q=j+1;q<k&&mod;q++){
                ans.push_back({g[i][j],g[i][q]});
                mod--;
                if(mod==0){
                    break;
                }
            }
        }
    }
    if(mod){
        cout<<-1<<endl;
        return ;
    }
    for(auto p:ans){
        cout<<p.first<<" "<<p.second<<endl;

    }
    return ;


}


signed main(){
    int t=1;
    while(t--) solve();
    
}

标签:std,int,35,牛客,vector,solve,long,Round,define
From: https://www.cnblogs.com/du463/p/18052542

相关文章

  • Educational Codeforces Round 162 E 点分治 虚树 树形dp
    传送门给出\(n\le2\cdot10^5\)的一棵树,每个节点有一个颜色。求出路径长度为\(2\)路径首端和尾端拥有相同颜色,且路径上其他点不存在相同颜色的点的路径条数。当时看错题了,把颜色抽出来后没法做了。后来感觉能点分治,然后把题看对了,遂写了一个极其抽象的点分治。除此之外,把某......
  • Codeforces Round 930 (Div. 1) C dij 建图
    离较好的方法差一点。考虑到了可以按照枚举属性并按照当前属性从小到大排序,这样可以从一个点到大另一个点。设当前在排序序列中点为\(i\)当\(i\)走向\(k,i>=k\)需要支付\(c_k\)的代价。而\(i\)到\(k,i<k\)则需\(k-i+c_k\)的代价。则对于不同的\(i\)由于代价没有连续性,当时想......
  • Codeforces Round 892 (Div. 2)
    \[\large\text{Round7:CodeforcesRound892(Div.2)(VP)}\]一言:所谓人,无论是谁到了最后,都会形单影只。——悠久之翼2最令人无语的是最后三分钟交代码的时候把\(\text{D}\)题交到了\(\text{E}\)题,结果能过的代码直接没有过。。\(\text{D:AndreyandEscapefr......
  • Educational Codeforces Round 120
    \[\large\text{Round1:EducationalCodeforcesRound120(VP)}\]一言:孤独的人不会伤害别人,只会不断地伤害自己罢了。——我的青春恋爱物语果然有问题\(\text{C:SetorDecrease}\)后四题唯一场切题,(别问我为什么只有这一道)。读完题之后,理一下思路,可以很容易的想到......
  • Codeforces Round 893 (Div. 2)
    \[\large\text{Round3:CodeforcesRound893(Div.2)(VP)}\]一言:从你站在桥上看我的那一刻起你就是我的世界——火影忍者不是很满意,还是没有突破\(\text{D}\)题,确实是没有想到这题竟然如此毒瘤。。\(\text{D:TreesandSegments}\)首先不难想到一种思路,就是枚举......
  • Codeforces Round 806 (Div. 4) A-G(补题)
    A.YESorYES?思路:一次判断三个字母是否是y、e、s的大小写即可。这题是很久前写的,哈哈,马蜂改了不少。。#include<bits/stdc++.h>usingnamespacestd;intn;chars[5];intmain(){ scanf("%d",&n); for(inti=1;i<=n;i++){ scanf("%s",s+1); if......
  • 牛客周赛 Round 35
    A.小红的字符串切割思路:拿到了一个长度为偶数的字符串,请你将其切割成长度相等的两部分并输出Code:#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;cin>>s;for(inti=0;i<s.size()/2;i++){cout<<s[i];}c......
  • 牛客周赛 Round 35
    牛客周赛Round35小红的字符串切割代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;typedefdoubledb;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pair<ll,pair<ll,ll>......
  • 牛客大厂真题刷题记录
    1、问题:统计在有用户互动的最近一个月(按包含当天在内的近30天算,比如10月31日的近30天为10.2~10.31之间的数据)中,每类视频的转发量和转发率(保留3位小数)。注:转发率=转发量÷播放量。结果按转发率降序排序。selecttag,sum(if_retweet)retweet_cut,round(sum(if_retweet)/coun......
  • 牛客练习赛122
    牛客练习赛122黑白配代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;typedefdoubledb;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pair<ll,pair<ll,ll>>;cons......