首页 > 其他分享 >2019年牛客普及模拟赛5

2019年牛客普及模拟赛5

时间:2023-08-24 23:56:44浏览次数:49  
标签:普及 const int long 牛客 2019 ans include lld

字符统计:给出一个只包含空格和小写字母的字符串,问出现次数最多的字符(多个字符按照字典序输出)

签到题。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int sum[250];
char ans[250];

signed main()
{
	//freopen("T1.in","r",stdin);
	//freopen("T1.out","w",stdout);
	string x;getline(cin,x);
	int len=x.size();
	for(int i=0;i<len;i++) sum[x[i]]++;
	int mx=0,cnt=0;
	for(int i='a';i<='z';i++){
		if(sum[i]>mx){
			mx=sum[i];
			cnt=0;ans[++cnt]=i;
		}
		else if(sum[i]==mx) ans[++cnt]=i;
	}
	for(int i=1;i<=cnt;i++) cout<<ans[i];
	return 0;
}

填数游戏:给出 \(n\) 个空,每个空有一个权值,再给出 \(m\) 个数(\(m\ge n\)),选出 \(n\) 个数填在空里,每填一个数对答案的贡献为这个数乘以这个空的权值,问答案的最大值。

一眼贪心,对于 \(a\) 中小于等于 \(0\) 的和 \(b\) 小的配,对于 \(a\) 中大于 \(0\) 的和 \(b\) 大的配。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
const int N=1e5+5;
int a[N],b[N];

signed main()
{
	//freopen("T2.in","r",stdin);
	//freopen("T2.out","w",stdout);
	scanf("%lld%lld ",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=m;i++) scanf("%lld",&b[i]);
	sort(a+1,a+n+1);sort(b+1,b+m+1);
	int pos=0,ans=0;
	for(int i=1;i<=n;i++){
		if(a[i]<=0) ans+=a[i]*b[i],pos=i;
	}
	for(int i=n,j=m;i>pos;i--,j--) ans+=a[i]*b[j];
	printf("%lld",ans);
	return 0;
}

夹道之樱:一个 \(n\) 个点的带权无向连通图的起点为 \(1\),终点为 \(n\),找出一条路径,满足经过的边的最大值减最小值最小,问这个差值为多少。

枚举边权,判断连通,并查集即可。

真服了,暴力我没有想出来。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans;
const int N=2e3+5,M=4e3+5;
const int inf=0x3f3f3f3f;
struct Edge{
	int u,v,w;
}a[M];
struct DSU{
	int fa[N];
	void init(){
		for(int i=1;i<=n;i++) fa[i]=i;
		return ;
	}
	int find(int x){
		if(fa[x]==x) return x;
		return fa[x]=find(fa[x]);
	}
	void merge(int x,int y){
		int fx=find(x),fy=find(y);
		if(fx==fy) return ;
		fa[fx]=fy;
	}
}pav;

signed main()
{
	//freopen("T3.in","r",stdin);
	//freopen("T3.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&a[i].u,&a[i].v,&a[i].w);
	sort(a+1,a+m+1,[](Edge x,Edge y){return x.w<y.w;});
	int ans=inf;
	for(int i=1;i<=m;i++){
		pav.init();
		for(int j=i;j>=1;j--){
			pav.merge(a[j].u,a[j].v);
			if(pav.find(1)==pav.find(n)){
				ans=min(ans,a[i].w-a[j].w);
				break;
			}
		}
	}
	printf("%lld",ans);
	return 0;
}

终焉之理:给出一个正整数序列以及数 \(k\),每一轮从第一项开始,排序 \([1\sim k]\ [2\sim k+1]\ ……\),问需要几轮才可以让原序列变得有序。

这个操作可以看作一个数是把左边比它大的数移到右边,但是移动的区间有限制,每一次最多移动左边的 \(k-1\) 个数,而这个数左边大于它的数肯定都是紧贴着它着,所以需要 \(\lceil \frac{num}{k-1} \rceil\) 轮才可以移到指定位置(\(num\) 表示左边有多少个数比它大)。

这不就是逆序对嘛,可以直接树状数组。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
const int N=1e5+5;
struct BIT{
	int tree[N];
	void init(){
		for(int i=1;i<N;i++) tree[i]=0;
		return ;
	}
	int lowbit(int x){
		return x&-x;
	}
	void add(int key,int x){
		while(key<=N){
			tree[key]+=x;
			key+=lowbit(key);
		}
		return ;
	}
	int ask(int key){
		int ans=0;
		while(key>0){
			ans+=tree[key];
			key-=lowbit(key);
		}
		return ans;
	}
}T;

signed main()
{
	int t;scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld",&n,&k);
		int mx=0;T.init();
		for(int i=1;i<=n;i++){
			int x;scanf("%lld",&x);
			T.add(x,1);
			mx=max(mx,i-T.ask(x));
		}
		int ans=ceil(num*1.0/(k-1));
		printf("%lld\n",ans);
	}
	return 0;
}

有一个更简便的方法,由于左边大于自己的数是紧贴自己的,所以原序列的位置减去最后移到的位置就是左边有多少个数比它大。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
const int N=1e5+5;
struct Num{
	int val,id;
}a[N];

bool cmp(Num x,Num y){
	return x.val<y.val;
}
signed main()
{
	int T;scanf("%lld",&T);
	while(T--){
		scanf("%lld%lld",&n,&k);
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i].val);
			a[i].id=i;
		}
		stable_sort(a+1,a+n+1,cmp);
		int mx=0;
		for(int i=1;i<=n;i++) mx=max(mx,a[i].id-i);
		int ans=ceil(mx*1.0/(k-1));
		printf("%lld\n",ans);
	}
	return 0;
}

标签:普及,const,int,long,牛客,2019,ans,include,lld
From: https://www.cnblogs.com/HEIMOFA/p/17655485.html

相关文章

  • 牛客七夕比赛 题解
    标准的算法竞赛题有下面几个,写这篇博客主要是这个M很有意思,一直没绕过来这个弯如果你有更牛逼的构造方法欢迎交流指导。B构造边长为\(n\)的矩阵,使得每个\(2\times2\)的子矩形的权值和的极差最小两个指针L=1,R=\(n^2\)。将网格黑白染色后按照顺序遍历,黑色填\(R\)......
  • 【Protoc】VS2019 (VS平台) 使用 CMake 编译安装、使用 Protobuf 库
    背景:工作中需要使用到protobuf,看了一些教程,感觉都不是很适合,便自己总结一些开发环境:Win10VS2019CMake3.24.2Protobuf3.21.12(Protoc版本必须于Protobuf版本一致)MinGW版本的编译在之后有空再研究。https://stackoverflow.com/questions/9243816/how-to-build-......
  • error LNK2019: 无法解析的外部符号 (VS2022创建QT文件)
    运行过程中,编译没有问题,但是在输出会显示以下问题 同时出现errorLNK2001、2019、1120,查询网上一些资料得知是链接过程中出现错误:属于的类型是包含符号定义的目标文件或库未链接。由于使用VS2022上拓展的工具QTVSTools创建的QT文件,在使用以下两个头文件:#include"QtNetWor......
  • 8.22普及模拟三
    \(\large{T1\最大生成树}\\\tiny{30pts}\)题意:给定一个点权为\(a_i\)边权为\(|a_i-a_j|\)的完全图,求这个图的最大生成树部分分:30~50pts:Kruskal求最长路100pts:贪心,设权值最大点为\(a_{max}\),权值最小点为\(a_{min}\)则\(max(|a_{max}-a_i|,|a_{min}-a_i|)\)一定......
  • 【题解】洛谷 P1002 [NOIP2002 普及组] 过河卒
    原题链接解题思路这是一道经典的动态规划题目。如果尝试使用深度优先搜索(dfs)或广度优先搜索(bfs)做就会获得TLE(注意数据范围)。于是我们想到了更为高级的动态规划(DynamicProgramming,dp)。简略介绍动态规划算法的核心思想:把原问题分解为相对简单的子问题的方式求解复杂问题。......
  • 在Docker上安装部署SQL Server2019 Express
    在Docker上安装部署SQLServer2019Express_docker安装sqlserver2019_梦想天空分外蓝的博客-CSDN博客  梦想天空分外蓝_-CSDN博客......
  • 普及模拟3
    普及模拟3\(T1\)最大生成树\(100pts\)简化题意:给定一个\(n(1\len\le1\times10^5)\)个点的完全图,给定各点的点权\(a_i(1\lei\len)\),两点间的边权为\(|a_i-a_j|\),求该图的最大生成树。正解:贪心,考虑到一个点对答案产生的贡献为\(\max(a_i-\min\limits_{j=1}^{......
  • 「NOIP2008 普及组」ISBN 号码 题解
    前言转自博客,早期黑历史作品。这是本蒟蒻の第一篇题解qwq,发在博客上,还请多多关照.这道题是一道橙题,难度没有太大的问题,对于大犇们来说自然是一遍过的,本蒟就只能调调再交了.题面传送门题目描述每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字、1......
  • 「CSP-J2019」交通换乘 题解
    转自博客。传送门一道橙题,但是会T。题面[CSP-J2019]公交换乘题目描述著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:在搭乘一次地铁后可以获得一张优惠票,有效期为45分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地......
  • 用友BIP重磅升级,引领企业数智化迈入AI普及应用时代
    8月19日,由用友主办的“2023全球商业创新大会”在上海隆重召开。本次大会以“数据驱动、智能运营”为主题,汇聚众多行业领先企业及各界商业精英,深入探讨解决企业数智化面临的全面数据服务、AI普及应用、升级数智底座、主题化融合应用创新、价值化国产替代及中企出海等诸多课题。会上,......