回 帖 发 新 帖 刷新版面

主题:第51次编程比赛

题目:训练场上n(1≤n≤50000)个[b][color=FF0000]高矮都不相同[/color][/b]的士兵[b]从左到右[/b]排成一行,依次编号为1,2,…,n。第i个士兵的身高H(i),由于采用特殊单位,H(i)满足1≤H(i)≤2000000000。设第i个士兵右侧最近的比他个高的士兵编号为j,则第i个士兵可看到在他的右侧比他矮的士兵的个数S(i)=j-i-1。(不考虑客观因素,比如视力范围等-,-)
求S(1)+S(2)+…+S(n)。

输入:
标准输入。
第一行为整数n,表示士兵的个数。
第二行n个整数,用一个空格隔开。分别表示编号为1,2。。。n的士兵的身高

输出:
S(1)+S(2)+…+S(n)的结果

例:
输入
6
10 3 7 4 12 2
输出
5

例子说明:
S(1) = 3
S(2) = 0
S(3) = 1
S(4) = 0
S(5) = 1
S(6) = 0
S(1)+S(2)+S(3)+S(4)+S(5)+S(6) = 3+0+1+0+1+0 = 5

回复列表 (共65个回复)

沙发

// 编译器: VC++6.0
#include <stdio.h>

int CountShort(int n, int height[]){
     register int i,j,sum;

    for(sum = i = 0; i < n; i ++)
        for(j = i+1; j < n; j ++){
            if(height[j] > height[i])
                break;
            sum ++;
        }
    return sum;
}

int main(){
    int i,j;
    int array[50000];

    scanf("%d",&i);
    for(j = 0; j < i; j ++)
        scanf("%d",&array[j]);
    printf("%d\n",CountShort(i,array));
    return 0;
}

板凳

#include<iostream>
using namespace std;
int main()
{
    int a[50001];
    int n,i,j,s;
    while(cin>>n)
    {
        for(i=0;i<n;i++)
            cin>>a[i];
        s=0;
        for(i=0;i<n;i++)
        {
            for(j=i+1;j<n;j++)
            {
                if(a[i]>=a[j])
                    s++;
                else break;
            }
        }
        cout<<s<<endl;
    }
    return 0;
}

3 楼

现在隐藏帖子!
写的等下贴上来,有点乱!

4 楼

回复后还不可以看到?

5 楼

#include<iostream>
#include<vector>
using namespace std;
int CountShort(int n,vector<int> height);
int main()
{
    int n;
    vector<int> H;
    int H_current;
    int S;

    cin>>n;
    H.reserve(n);

    for(int i=0;i<n;i++)
    {
        cin>>H_current;
        H.push_back(H_current);
    }

    S=CountShort(n,H);
    cout<<S<<endl;
    return 0;
}
int CountShort(int n,vector<int> height)
{
    int s=0,si;
    int i,j;

    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;)
        {
            if(height[i]>height[j])j++;
        else break;
        }
        si=j-i-1;
        s+=si;
    }
    return s;
}
如果可以换接口的话

6 楼

先站个座~~~观赏好的代码~~自己写的超级普通[em8][em8]

#include <stdio.h>
#include <iostream.h>
#include <malloc.h>
int main()
{
    int i,j,s,n,u;
    int sum=0;
    
    printf("请输入人数\n");
    scanf("%d",&n);
    int *a=(int *)malloc(n*sizeof(int));
    for(u=1;u<=n;u++)
    {
       printf("请输入请输入身高_\n");
       scanf("%d",&a[u]);
    }


    for(i=1;i<n;i++)
    {
        for(j=i+1;a[i]>a[j];j++){}

          if(j==n){break;}
          s=j-i-1;
          sum=sum+s;
    }
    printf("%d\n",sum);

}

7 楼

#include <iostream>

int main()
{
    int num;
    std::cin >> num;
    int i = 0;
    int height[num];
    int quantity[num];
    while (i < num)
    {
          std::cin >> height[i];
          quantity[i] = 0;
          i += 1;
    }
    for (int i = 0; i < num; i ++ )
    for (int j = i + 1; j < num; j ++ )
    {
        if (height[i] > height[j])
        quantity[i] += 1;
        else break;
    }
    int result = 0;
    for (int i = 0; i < num; i ++ )
    result += quantity[i];
    std::cout << result << '\n';
    return 0;
}

8 楼

/*
  Submission by crossbow on March 22, 2007 to
  The 51st Programming Contest,
  Programming Contest Section, C/C++ Board, Programfan Forum

  Method: Order Statistics
  Running Time: Linear
*/

#include <stdio.h>

#define MAXN 50000
#define MAXH 2000000000

unsigned int h[MAXN + 1] = { MAXH + 1 };
int s[MAXN + 1];
int N;

void solve(void)
{
    unsigned int c = 0;
    int t = 0;
    int i;
    for (i = 1; i <= N; i++)
    {
        while (t > 0 && h[s[t]] < h[i])
        {
            t--;
        }
        c += i - s[t] - 1;
        s[++t] = i;
    }
    printf("%u\n", c);
}

int main(void)
{
    int i;
    scanf("%d", &N);
    for (i = N; i > 0; i--)
    {
        scanf("%d", h + i);
    }
    solve();
    return 0;
}

9 楼

我是个初学者,编的不好啊 
#include <stdio.h>
#define M 50000
void main()
{
    int n,H[M],i,j,S[M];
    int sum=0;
    printf("\n请输入士兵个数:");
    scanf("%d",&n);
    printf("\n请输入%d个士兵的身高:",n);
    fflush(stdin);
    for(i=0;i<n;i++)
    {
        scanf("%d",&H[i]);
    }
        
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n+1;j++)
        {    
        
            if(H[i]<H[j])
            {
                
                S[i]=j-i-1;
                break;
                
            }
        
        
        }
        printf("\n%d\n",S[i]);
        sum=sum+S[i];
    }
    if(H[n-1]>H[n])
    {
        sum+=1;
    }
    printf("\n%d",sum);
}                

10 楼

#include <iostream>

using namespace std;

int Sum(int h[], int n);

int main(void)
{
    const int n = 5000;
    int h[n] = {0};
    
    for (int i=0; i<n; i++)
        h[i] = rand();
    
    for (int i=0; i<n; i++)
        cout << h[i] << "    ";
    cout << endl  << endl;
    
    cout << Sum(h, n) << endl;
    
    system("pause");
       return 0;


int Sum(int h[], int n)
{
    int i, j;
    int sum = 0;
    for (i=0; i<n; i++)//从左到右遍历每一个士兵 
    {
        for (j=i+1; h[j]<h[i] && j<n; j++)//累计士兵右边比他矮的人数 
            ;
        sum += j - i - 1;//累积总人数 
    }
    return sum;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册