NC54611. 消失的高数试卷
描述
输入描述
第一行输入两个数n, m, n为学生人数,m为询问数第二行n个整数,第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,最高分为7C 解法, 执行用时: 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]))