列表

详情


NC54611. 消失的高数试卷

描述

期中考试结束了,高数课代表呼小哧帮老师进行分数录入工作,他将试卷按照学号排好序并将分数录入到系统中.这时,牛牛突然来捣乱,拿走了一些学号连续的人的试卷,呼小哧想知道在牛牛拿走这些试卷后剩下人的最高分是多少(如果牛牛拿走了所有试卷那么输出0),你能帮帮他吗?
本题包含多次询问,每次询问之间相互独立

输入描述

第一行输入两个数n, m, n为学生人数,m为询问数
第二行n个整数,第i个数a_i表示学号为i的学生的高数分数
接下来m行,每行两个数l, r,表示牛牛拿走了学号在l到r这个区间里的人的试卷

输出描述

输出m行

每行一个数,表示剩下人的最高分

示例1

输入:

5 3
3 8 4 5 7
1 3
4 4
1 5

输出:

7
8
0

说明:

第一个询问牛牛拿走[1,3]的试卷,剩下人分数为5,7,最高分为7

第二个询问牛牛拿走[4,4]的试卷,剩下人分数为3,8,4,7,最高分为8

第三个询问牛牛拿走所有试卷,输出0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 459ms, 内存消耗: 3796K, 提交时间: 2022-11-22 15:32:28

#include<stdio.h>
int main()
{
	int i,j,m,n,max=0,p=1; 
	int c[100001]={0};
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&c[i]);
		if(c[p]<c[i]) p=i;
	}
	for(i=1;i<=m;i++)
	{
		int a,b;max=0;
		scanf("%d%d",&a,&b);
		if(a>p||b<p) {printf("%d\n",c[p]);continue;}
		for(j=1;j<a;j++)
		    if(c[j]>max) max=c[j];
		for(j=b+1;j<=n;j++)
		    if(c[j]>max) max=c[j];    
		printf("%d\n",max);
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 273ms, 内存消耗: 2540K, 提交时间: 2020-05-15 18:13:28

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int pre[100005];
int suf[100005];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    pre[0]=0;suf[n+1]=0;
    for(int i=0;i<n;i++) pre[i]=max(pre[i-1],a[i]);
    for(int i=n;i>=0;i--) suf[i]=max(suf[i+1],a[i]);
    while(m--){
        int x,y;
        cin>>x>>y;
        cout<<max(pre[x-1],suf[y+1])<<endl;
    }
}

C++(clang++ 11.0.1) 解法, 执行用时: 46ms, 内存消耗: 2436K, 提交时间: 2022-11-04 11:25:58

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N],c[N];
int main(){
	int n,m; 
		scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		b[i]=max(a[i],b[i-1]);
	}
for(int i=n;i>=1;i--)
c[i]=max(a[i],c[i+1]);
while(m--){
	int l,r;
	scanf("%d%d",&l,&r);
printf("%d\n",max(b[l-1],c[r+1]));
} 
return 0;
} 

Python3 解法, 执行用时: 831ms, 内存消耗: 15744K, 提交时间: 2022-08-29 19:11:49

n, m = map(int, input().split())
a = list(map(int, input().split()))
b, c = [0], [0]
for i in range(n):
    b.append(max(a[i], b[-1]))
    c.append(max(a[n-i-1], c[-1]))
c.reverse()
for _ in range(m):
    L, R = map(int, input().split())
    print(max(b[L-1], c[R]))

上一题