P1297小气的小B

来源:互联网 发布:塞班5软件下载 编辑:程序博客网 时间:2024/05/16 19:46
描述 Description
其实你们都不知道,小B是很小气的。一天小B带着他的弟弟小B'一起去摘果子,走着走着,他们忽然发现了一颗长满了果子的树。由于弟弟长得太矮了,弟弟只有让哥哥小B帮他摘一些果子下来。哥哥小B说:"弟弟啊,不是我不想给你摘多,我只是一次拿不了那么多,昨天晚上又没睡好,只能上一次树。所以哥哥只能给你摘一个哈。"没办法,弟弟只有答应了这个要求。
于是几下小B就上了树,树上的果子还真多,有N个呢!!但是小B很快发现这些果子大小不一。抠门的小B就想给自己拿个最大的,给弟弟拿个最小的果子。但是由于树上有些果子太高,小B不一定可以够着,所以他给你选了P个可以够着的果子区间,让你在这些区间里面找一个最大的果子和一个最小的果子。
输入格式 InputFormat
共p+2行,
  第一行为n和p,
  第二行为区间[1,n]的果子大小(用正整数表示)
  后面p行形如a b,意为每次询问的区间的左界和右界
输出格式 OutputFormat
共p行,第i行为第i次询问时得到的最大值以及最小值(一个询问用空格空开max和min)

【注意】在输入数据中果子的大小是无序的。
 
 
//思路:直接模拟可能会超时,(没有试验)
//这里可以进行一个预处理,先将输入的数字每1000个分为一组,并且记录这1000个中的最大值与最小值。
//在后序进行比较的时候,直接取出这1000个数中的最大值最小值即可。
 

实现代码:380ms

#include <stdio.h>#include <string.h>#define N 1000typedef struct {    int ma,mi;}maxmin;maxmin mamin[N];//int f[50100];int main(){    int i,j,n,p;    while(scanf("%d %d",&n,&p)!=EOF)    {        //初始化;        for(i=0;i<n;i++)            f[i]=0;        for(i=0;i<n/1000+1;i++)            mamin[i].ma=mamin[i].mi=0;        for(i=1;i<=n;i++)            scanf("%d",&f[i]);        int maa=f[0],mii=f[0];        j=0;        for(i=1;i<=n;i++)        {            if(f[i]>maa) maa=f[i];            if(f[i]<mii) mii=f[i];            if(i%1000==0)            {                mamin[j].ma=maa;                mamin[j++].mi=mii;                if(i+1<=n)                    maa=f[i+1];mii=f[i+1];            }        }        while(p--)        {            int x,y;            scanf("%d %d",&x,&y);            maa=mii=f[x];            if((y-x)/1000 <=1)            {                for(i=x;i<=y;i++)                {                    if(f[i]>maa) maa=f[i];                    if(f[i]<mii) mii=f[i];                }            }            else            {                int start,last,t;                start=x/1000;last=y/1000;                t=last-start;                int end;                end=(start+1)*1000;                for(i=x;i<=end;i++)                {                    if(f[i]>maa) maa=f[i];                    if(f[i]<mii) mii=f[i];                }                for(i=start+1;i<last;i++)                {                    if(mamin[i].ma>maa) maa=mamin[i].ma;                    if(mamin[i].mi<mii) mii=mamin[i].mi;                }                for(i=last*1000;i<=y;i++)                {                    if(f[i]>maa) maa=f[i];                    if(f[i]<mii) mii=f[i];                }            }            printf("%d %d\n",maa,mii);        }            }    return 0;}

 

 

 

 

 

 

0 0
原创粉丝点击