主题:第51次编程比赛
renew [专家分:200] 发布于 2007-03-22 18:02:00
题目:训练场上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
最后更新于:2007-03-26 00:19:00
回复列表 (共65个回复)
沙发
江南孤峰 [专家分:1520] 发布于 2007-03-22 18:19:00
// 编译器: 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;
}
板凳
shenjia71 [专家分:0] 发布于 2007-03-22 19:05:00
#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 楼
zzc0816 [专家分:130] 发布于 2007-03-22 19:20:00
现在隐藏帖子!
写的等下贴上来,有点乱!
4 楼
zzc0816 [专家分:130] 发布于 2007-03-22 19:21:00
回复后还不可以看到?
5 楼
sanyuan [专家分:0] 发布于 2007-03-22 19:58:00
#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 楼
7zeal [专家分:370] 发布于 2007-03-22 21:07:00
先站个座~~~观赏好的代码~~自己写的超级普通[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 楼
__Sa [专家分:0] 发布于 2007-03-22 21:27:00
#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 楼
crossbow [专家分:150] 发布于 2007-03-22 21:38:00
/*
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 楼
flyingkelly [专家分:0] 发布于 2007-03-22 21:51:00
我是个初学者,编的不好啊
#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 楼
goal00001111 [专家分:4030] 发布于 2007-03-22 21:52:00
#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;
}
我来回复