一,合唱比赛
题目描述
河南农业大学信管学院举办一年一度的合唱比赛,目前你是评委之一,剩下还有其他的n位评委,给定一个正整数n和n个正整数表示这n个评委给目前在表演的团队的分数,评分规则为在所有评委(包括你)的分数中去掉一个最高分和最低分,剩下的取平均值(总共n-1个值),现在你可以参与评分(1~100之间的整数),问最终结果会在什么区间内,用两个数表示这个区间,结果保留6位小数。
输入描述:
第一行给定一个正整数n
输出描述:
输出两个保留六位的小数l,r表示答案。
输入
3 80 90 100
输出
85.000000 95.000000
输入
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 5 4
输出
0
输入
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
输入
3 3 001 110 211
输出
YES 1
输入
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
输出描述:
一行输出代表松鼠宝宝花费的最小力气
输入
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;
}