2023河南萌新联赛第(一)场:河南农业大学

一,合唱比赛

题目描述

河南农业大学信管学院举办一年一度的合唱比赛,目前你是评委之一,剩下还有其他的n位评委,给定一个正整数n和n个正整数表示这n个评委给目前在表演的团队的分数,评分规则为在所有评委(包括你)的分数中去掉一个最高分和最低分,剩下的取平均值(总共n-1个值),现在你可以参与评分(1~100之间的整数),问最终结果会在什么区间内,用两个数表示这个区间,结果保留6位小数。

输入描述:

 
 

第一行给定一个正整数n

接下来一行给定n个整数表示n个评委的分数
2<=n<=1000

输出描述:

 
 

输出两个保留六位的小数l,r表示答案。

示例1

输入

3
80 90 100

输出

85.000000 95.000000
示例2

输入

4
3 5 9 13

输出

5.666667 9.000000

代码实现

#include<iostream>
using namespace std;
int main(){
	double minn=1000.0;
	double maxx=1.0;
	int n;
	int sum=0;
	cin>>n;
	int u=n-1;
	while(n--){
		double k;
		cin>>k;
		sum+=k;
		minn=min(minn,k);
		maxx=max(maxx,k);
	}
	int ans1=sum-minn;
	int ans2=sum-maxx;
	printf("%.6f ",ans2/(1.0*u));
	printf("%.6f\n",ans1/(1.0*u));
	return 0;
}

二,动物朋友

题目描述

已知有n个动物朋友排成一排,每个动物朋友都有一个正整数的快乐值,涛涛每次会和连续的动物朋友玩,并且获得这些动物朋友快乐值的和的快乐,而涛涛是个完美主义者,他觉得快乐值刚好是m时候才是快乐的,现在请问有多少种选择方式,使得所选的连续的动物朋友的快乐值刚好为m。

输入描述:

 
      

第一行输入n(1<=n<=1e6)和m(1<=m<=1e6)。

第二行输入n个正整数,第i个代表第i个动物朋友的快乐值。(1<=ai<=1e5)

输出描述:

 
      

一个整数,表示可能存在的选法数量,如果没有,就输出0;

示例1

输入

1 5
4

输出

 
0
示例2

输入

11 45
1 4 1 9 19 8 10 8 1 2 3

输出

1

解题思路

先求出前缀和再,再利用双指针遍历每个有可能的区间,统计答案

代码实现

#include<iostream>
using namespace std;

const int N=1e6+10;
int a[N];
long long sum[N];
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++){     //求前缀和
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	int ans=0;
	for(int i=0,j=0;i<n;i++){     
		if(sum[i]-sum[j]==m){     //当有符合的答案就加一
			ans++; 
		}
		if(sum[i]-sum[j]>m){    //当i到j的区间内的和大于m时就移动j让区间内的元素和保持小于等于m。
			j++;
			i--;
		}
	}
	cout<<ans<<endl;
	return 0;
}

三,Reverse

题目描述

给定一个长度为n的01串,你需要选择一段任意长度(可以为0)的区间对其翻转,翻转后,求最长的一段连续的全是1的区间的长度。
 

输入描述:

输入共2行。
第一行一个整数n(1≤n≤106)n(1\leq n \leq 10^6)n(1≤n≤106)。
第二行一个长度为n的01序列。

输出描述:

输出一个整数,表示最长的长度。

示例1

输入

10
0111001011

输出

5

说明

翻转区间[5,10],翻转为0111110100。

解题思路

可以先用一个循环统计一下最的的连续1有多少个并记录这个区间,把这个区间删除后,再用一个循环记录下一个最大值,经过推导可以知道两个值的和就是答案

代码实现

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int maxx1=0,maxx2=0;
    string s;
    cin>>s;
    int k=0;
    int mid;
    for(int i=0;i<n;i++){
        if(s[i]==s[i-1]&&s[i]=='1'){
            k++;
        }else if(s[i]=='1'){
            k=1;
        }
        if(k>maxx1){
        	maxx1=k;
        	mid=i;
		}
    }
    for(int i=mid-maxx1+1;i<=mid;i++)s[i]='0';
    k=0;
    for(int i=0;i<n;i++){
        if(s[i]==s[i-1]&&s[i]=='1'){
            k++;
        }else if(s[i]=='1'){
            k=1;
        }
        maxx2=max(maxx2,k);
    }
    
    cout<<maxx1+maxx2<<endl;
    return 0;
    
}

四,以撒和隐藏房间

题目描述

你说得对,但是以撒的结合是一款集合了推箱子、血统检验、少女换装、宠物养成等等元素的地牢探险/Rougelike类跨世代大作。游戏发生在以撒和他的妈妈住的小房子的[地下室]里,在这里,天真的以撒受[教条]的影响,进入了一场幻想中的地下室冒险。你将扮演以撒扮演的圣经中的人物,在充满怪物和杂物的地下室里获取各种激起回忆的道具,靠败们击败天使或是恶魔的阻挡,找回缺失的亲情——同时,逐步发掘[父母离异]的真相。

以撒又一次的逃进了地下室

地下室可以看作一个n*m的矩阵的迷宫,其中有些格子是有门相连房间,有些则是无法通过的墙壁。以撒发现其中一些墙壁似乎是空心的,可以通过爆炸打开隐藏的房间,而隐藏房的生成有一定的规律,以撒认为一个墙壁格子在满足以下所有情况时可能会是隐藏房间:

1, 该墙壁格子和三个普通房间相邻

2, 在满足1条件的情况下,不能和boss房间相邻

但是以撒正在和萌死戳交战,

现在你需要编写程序告诉他是否存在可能是隐藏房间的格子。

如果存在,输出两行,第一行是一个YES,第二行输出可能为隐藏房间的格子的数量

如果不存在,输出NO

输入描述:

 
           

第一行两个整数n,m(3<m,n<=1000)

然后是一个n*m矩阵,表示地图状态,0表示墙壁,1表示房间,2表示boss房间

输出描述:

 
           

如果存在,输出两行,第一行是一个YES,第二行输出可能为隐藏房间的格子的数量

如果不存在,输出NO

示例1

输入

3 3
001
110
211

输出

YES
1
示例2

输入

3 4
0010
1111
0102

输出

NO

备注:

隐藏房间不属于房间

解题思路

无脑直接遍历,先判断相邻的四个方向有没有boos有的话直接continue跳过,没有的话再判断四个方向是否有三个普通房间(一定要是三个四个的话不行)

代码实现

#include<iostream>
using namespace std;
const int N=1010;
char s[N][N];

int main(){
	int n,m;
    cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>s[i][j];
		}
	}
	int ans=0;
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(s[i][j]=='0'){
				if(s[i+1][j]=='2'||s[i][j+1]=='2'||s[i-1][j]=='2'||s[i][j-1]=='2')
			    continue;
			else{
				int k=0;
				if(s[i+1][j]=='1')
				k++;
				if(s[i][j+1]=='1')
				k++;
				if(s[i-1][j]=='1')
				k++;
				if(s[i][j-1]=='1')
				k++;
				if(k==3){
                    ans++;
                }
			} 
			}
		}
	}	
    if(ans>=1)
	cout<<"YES"<<endl<<ans<<endl;
    else
    cout<<"NO"<<endl;
	return 0;
}

 五,松鼠排序

题目描述

松鼠宝宝有一排n个大小不一的坚果,松鼠宝宝想把坚果从小到大排序,每次他会选择两个坚果a和b每次花费1点力气把这两个坚果交换,爱动脑筋的松鼠宝宝想知道他排完这n个坚果一共需要花费的最少力气是多少?

输入描述:

 
            

第一行一个整数n代表坚果数

接下来一行n个整数代表每个坚果的大小(每个坚果大小都不一样,即大小为1-n的一个排列)

1<=n<=1e5

坚果大小x,1<=x<=n

输出描述:

 
            

一行输出代表松鼠宝宝花费的最小力气

示例1

输入

3
3 2 1

输出

1

解题思路

也是暴力实现,从第一个元素开始枚举如果第i位置上的元素大小不为i的话,就把这个元素与这个元素应该在的位置的元素进行交换,一直到这个元素的大小等于对应的i值再进行下一个元素的判断。

代码实现

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int a[N];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	
	int ans=0;
	for(int i=1;i<=n;i++){
		while(i!=a[i]){
			swap(a[i],a[a[i]]);ans++; 
		}
	}
	cout<<ans<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值