NYOJ---看美女I(1045),II(1052)

来源:互联网 发布:原生linux笔记本 编辑:程序博客网 时间:2024/05/22 12:46

看美女

时间限制:1000 ms  |  内存限制:65535 KB
难度:0
描述

“排排站,赏美女……”
       Fujun师兄在今年南京赛区人品爆发,怒摘银奖,心情倍好,现组织大家去海边站成一排看美女 ^.^
       N个人站成一排。不巧,美女们只在队伍的最左边和最右边,你们可以向左看或者向右看。如果第i个人向左看,当且仅当第i个人的身高h[i]>=h[j] ( j=1...i-1) 时,他能看到美女;如果第i个人向右看,当且仅当第i个人的身高h[i]>=h[j] (j=i+1..N)时,他能看见美女。已知N个人的身高,求最多有多少人能看到美女。

输入
先输入一个数T 表T组
每组数据: 第一行 N。N<=100 000
第二行 N个整数, 1<=h<=20000
  
输出
输出答案 换行。
样例输入
151 4 7 6 2
样例输出
5
上传者
TC_杨闯亮

思路题,当初自己做的时候,for循环没有控制好,搞了差不多一天半( 小菜逼一枚,如有大神路过,请勿喷)
做完发现自己想的难了,两种做法:
1:从前面扫一遍,接着从后扫一遍。记录sum值。
ps:
/****************
Times:8ms.
****************/
<pre name="code" class="cpp">#include<stdio.h>#include<string.h>int main(){    int T,n,i,a[100005],b[100005];    int m_ax,sum;    scanf("%d",&T);    while(T--)    {        memset(b,0,sizeof(b));        scanf("%d",&n);        for(i=1; i<=n; i++)            scanf("%d",&a[i]);        m_ax=a[1];        sum=0;        for(i=1; i<=n; i++)        {            if(a[i]>=m_ax)            {                m_ax=a[i];                sum++;                b[i]=1;//记录下标,同时标记。            }        }        m_ax=a[n];        for(i=n; i>0; i--)        {            if(a[i]>=m_ax)            {                m_ax=a[i];                if(b[i]==0)                    sum++;            }        }        printf("%d\n",sum);    }    return 0;}


        
2: 思路跟第一种差不多,找出最大值,记为MAX,MAX左边和右边同时查找。

/****************Times:28ms.****************/#include<stdio.h>int a[20005];int main(){    int n,N;    scanf("%d",&N);    while(N--)    {        int q,maxx=-1;//       printf("%d\n",maxx);        scanf("%d",&n);        for(int i=0; i<n; i++)        {            scanf("%d",&a[i]);            if(maxx<a[i])            {                q=i,maxx=a[i];//找出最大值,记录下标。            }        }        int sum=1;        for(int i=q-1; i>=0; i--)//往左扫一边        {            int f=1;            for(int j=0; j<i; j++)            {                if(a[j]>a[i])                {                    f=0;                    break;                }            }            if(f) sum++;        }        for(int i=q+1; i<n; i++)//往右扫一遍        {            int f=1;            for(int j=n-1; j>i; j--)            {                if(a[j]>a[i])                {                    f=0;                    break;                }            }            if(f) sum++;        }        printf("%d\n",sum);    }}

看美女(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述
“排排站,赏美女……”
       N个人站成一排。不巧,美女们只在队伍的最左边和最右边,你们可以向左看或者向右看。如果第i个人向左看,当且仅当第i个人的身高h[i]>h[j] ( j=1...i-1) 时,他能看到美女;如果第i个人向右看,当且仅当第i个人的身高h[i]>h[j] (j=i+1..N)时,他能看见美女。已知N个人的身高,为了能让更多的人看到美女,你的任务是找出最好的站队方法,让最多的人能看到美女,输出最多有多少人可以看到美女。
输入
先输入一个数T 表T组
每组数据: 第一行 N。N<=100 000
第二行 N个整数, 1<=h<=20000
输出
输出答案 换行。
样例输入
151 4 7 6 2
样例输出
5
来源
原创
上传者
TC_胡仁东
看美女(一)的变形:
<span style="font-family: Tahoma, Arial, sans-serif, simsun;">/***************</span>
Times:0ms.
***************/
#include<stdio.h>#include<string.h>int a[20001];int main(){   int i,t;   scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        memset(a,0,sizeof(a));        int k;        for(i=0;i<n;i++){     scanf("%d",&k);a[k]++;  }//printf("%d",a[k])        int m=n;        for(i=0;i<20001;i++){        if(a[i]>=3)            m=m-a[i]+2;}        printf("%d\n",m);    }return 0;}         


0 0