回 帖 发 新 帖 刷新版面

主题:第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个回复)

31 楼

#include <iostream.h>
#include <stdlib.h>
    struct list 
    {
        int num;
        struct list *next;
    };
    typedef struct list type;
    typedef type *link;
void main()
 {
     int i,n;
     link head;
     link pre1;
     head=(link)malloc(sizeof(type));
     head->next=NULL;
     pre1=head;
     cout<<"输入士兵个数:";
     cin>>n;
     for(i=0;i<n;i++)
        {    cin>>pre1->num;                                //输入士兵身高
            pre1->next=(link)malloc(sizeof(type));
            pre1->next->next=NULL;
            pre1=pre1->next;
        } 
     int temp1,temp2;
     int sum=0,count=0;
     link pre2;
     link jtemp;
     pre1=head;
     pre2=head;
     pre2=pre2->next;
    while(pre1->next!=NULL)
     {     
         temp1=pre1->num;
         temp2=pre2->num;
         jtemp=pre2;              //保存指向
         while(temp1>temp2)                            
         {
            if(pre2->next!=NULL)
                {
                pre2=pre2->next;
                temp2=pre2->num;
                count++;}
            else
                break;
         }
          pre2=jtemp;           //恢复原指向
          sum=sum+count;
          count=0;
          pre1=pre1->next;
          pre2=pre2->next;
     }
     cout<<sum<<'\n';
 }

32 楼

#include <iostream>

using   namespace  std;

int     sum=0;
int    *list;

void   fun(int f,int e)
{
    if( f==e )
        return ;
    int  i, Max=list[ f ], Maxpos=f;
    for( i=f; i<=e; ++i )
    {
        if( list[ i ]>Max )
        {
            Max=list[ i ];
            Maxpos=i;
        }
    }
    sum=sum+e-Maxpos;
    if( Maxpos>f )
        fun(f,Maxpos-1);
    if( Maxpos<e )
        fun(Maxpos+1,e);

    return ;
}

int   main()
{
       int len;
       cin>>len;
       list=new int[ len ];
       int  i;
       for( i=0; i<len; ++i )
             cin>>list[ i ];
       fun( 0, len-1 );
       cout<<sum<<endl;
       system("PAUSE");
       delete [ ]list;
       return 1;
}

33 楼

#include <iostream>
#include <stack>
#include <vector>
using namespace std;

int main()
{
    vector<double> height;
    stack<int> index;
    int n,res;
    double ftemp;
    while(cin>>n&&n){
        res=0;height.clear();while(!index.empty()){index.pop();}
        for(int i=0;i<n;i++){
            cin>>ftemp;
            height.push_back(ftemp);
            for(;!index.empty()&&(ftemp>height[index.top()]);index.pop()){
                res+=(i-index.top()-1);
            }
            index.push(i);
        }
        for(;!index.empty();index.pop()){
            res+=(n-index.top()-1);
        }
        cout<<res<<endl;
    }
    return 0;
}

34 楼

#include <stdio.h>
#define N 5000

long n;
long a[N];

long count(int s)
{
   int i, p, sum;
   p = a[s];   
   sum = 0;
   for(i=s+1; i<n; i++)
   {
    if(a[i] < p) ++sum;
    else break;
   }
   return sum;
}

void main()
{
   int i, sum = 0;
   printf("\nPlease Input n(1~50000): ");
   scanf("%d", &n);
   while(!(1<n && n<50000)) scanf("%d", &n);
   printf("Please Input %d numbers(long):", n);

   for(i=0; i<n; i++)
   {
     scanf("%d", &a[i]); 
   }
   for(i=0; i<n; i++)
     sum += count(i);
   printf("The result is: %d\n", sum);
}

35 楼

#include<iostream>
using namespace std;

int main()
{
    long n;
    cin >> n;
    long *Height=new long[n];
    if(Height==NULL)
    {
        cout << "Out of space" << endl;
        exit(0);
    }
    for(long i=0; i<n; i++)
    {
        cin >> Height[i];
    }
    long Sum=0;
    for(long i=0; i<n; i++)
    {
        for(long k=i+1; Height[k]<Height[i] && k<n; k++)
        {
            Sum++;
        }
    }
    cout << Sum << endl;
    delete []Height;
}

36 楼

#include <iostream>
using namespace std;

__int64 f(int n,int *height){
    int * stack    =    new int [n];
    int top,index;
    __int64 count    =    0;
    top        =    0;
    index    =    0;
    *(stack + top)    =    index;
    top++;
    index++;
    while(index < n){
        if(* (height + *(stack + top -1)) > *(height + index)){
            *(stack + top)    =    index;
            top++;
            index++;
        }
        else{
            while(top > 0 && *(height + *(stack + top -1)) < *(height + index)){
                count += (__int64)(index - *(stack + top -1) - 1);
                top--;
            }
            *(stack + top )    =    index;
            top++;
            index++;
        }
    }
    if(top <= 1){
        delete []stack;
        return count;
    }
    for(int i = top - 1;i >= 1;i--)
        count += (__int64)( *(stack + top -1) - *(stack + i -1) );
    delete []stack;
    return count;
}
int main(int argc, char* argv[])
{
    int n;
    cin>>n;
    while(n){
        int * height    =    new    int [n];
        for(int i = 0;i < n;i++)
            cin>>*(height + i);
        printf("%I64d\n",f(n,height));
        delete []height;
        cin>>n;
  }
    return 0;
}

37 楼

//using VC++6.0

#include "stdafx.h"
#include <iostream>
#define MAX 50000

using namespace std;

unsigned int S(unsigned int n,unsigned long h[])
{
    unsigned int i,j;
    unsigned int result=0;
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(h[i]<=h[j])
                break;
            else
                result++;
    return result;
}

int main(int argc, char* argv[])
{
    cout<<"请输入整数的个数n:";
    unsigned int n;
    unsigned long h[MAX];
    cin>>n;
    cout<<"请输入"<<n<<"个整数:";
    for(int i=0;i<n;i++)
        cin>>h[i];
    cout<<"结果为:"<<S(n,h)<<endl;
    
    return 0;
}

38 楼

#include "stdio.h"
main()
{
  int j,i,sum=0,n,k=1;
  long int h[50],d,max=0;
  printf("please input the number of the Soldier(n<=5000):");
  scanf("%d",&n);
  
  for( i=1; i<=n; i++ )
   {
       
        scanf("%ld",&d);
          h[i]=d;
     if (d>max) {max=d;k=i;}
          for(j=k ; j<i; j++ )
           {  if(h[j]!=0&&h[j]>h[i])
                sum++; 
              if(h[j]<h[i]) h[j]=0; }
       
       }
   printf("%d",sum);
}

39 楼

#include<stdio.h>
int counter(int n,int a[])
     {
    int i,j,sum=0;
     for(i=0;i<=n-1;i++)
      {for(j=i+1;j<=n-1;j++)
          {if(a[i]>a[j])
          sum++;
        else
          break;
          }
      }
    return sum;
     }
  main()
   { int a[50]={0};
      int i,num,n,*p;
      p=&a[0];
     printf("input n:");
     scanf("%d",&n);
     for(i=0;i<=n-1;i++)
    {printf("please input the height of the soldier:");
      scanf("%d",&a[i]);
    }
    num=counter(n,p);
    printf("%d",num);
    return 0;
   }

40 楼

#include <stdio.h>

const int N = 50001;
struct INFO{
    int i, h;
}s[N];
int main()
{
    int i, top, sum, tmp, n;
    while(scanf("%d", &n) != EOF){        
        for(i = sum = 0, top = -1; i < n; i++){
            scanf("%d", &tmp);
            while(top >= 0 && tmp > s[top].h)
                sum += (i - s[top--].i - 1);            
            s[++top].i = i;
            s[top].h = tmp;
        }
        while(top >= 0)
            sum += (n - s[top--].i - 1);
        printf("%d\n", sum);
    }
    return 0;
}

输入输出用freopen就好了。。

我来回复

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