题解 P1816 【忠诚】

· · 题解

先按照动归做的,结果的了九十分,代码比较好理解;

就超了4毫秒。。。。。。。。。

90分代码;

#include<bits/stdc++.h>
using namespace std;
int a[100001];
int main(){
    int m,n,t,k,ans=9999999;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++){
        scanf("%d%d",&t,&k);
        for(int j=t;j<=k;j++){
            ans=min(ans,a[j]);
        }
        printf("%d ",ans);
        ans=9999999;
    }
    return 0;
}

下面是AC程序;

主要是快排,先把账目排一遍,再找提问范围里靠前的,找到后就输出;(比较好理解)

上代码

#include<bits/stdc++.h>
using namespace std;
struct fff{
  int x,y;  
};
fff a[100001];
bool cmp(fff l,fff v){
    return l.x<v.x;
}
int main(){
    int m,n,t,k;
    scanf("%d%d",&m,&n);
        for(int i=1;i<=m;i++){
            scanf("%d",&a[i].x);
            a[i].y=i;    //为每个账目编号;
        }
        sort(a+1,a+1+m,cmp);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&t,&k);
            for(int j=1;j<=m;j++){
                if(a[j].y>=t&&a[j].y<=k){
                    printf("%d ",a[j].x);
                    break;     //一个小优化;
                }
            }
        }
    return 0;
}