标题:[讨论]第九次编程题目,谢谢大家的支持.继续关注.
只看楼主
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
结帖率:50%
 问题点数:0 回复次数:30 
[讨论]第九次编程题目,谢谢大家的支持.继续关注.

PROBLEM:
N个1和N个0组成一个2N位的二进制数,要求从左到右扫描,1的累计数不小于0的累计数,试求满足这种条件的数的个数P

INPUT:
输入文件为:DATA1.IN
内有一个整数N(N<=100)

OUTPUT
输出文件为:ANS1.OUT
输出一个数P,P精确到个位,即输出所有数位

SAMPLE INPUT
3

SAMPLE OUTPUT
5

解释:
例如N=3时,P=5,为
111000
110100
110010
101010
101100

搜索更多相关主题的帖子: 二进制数 题目 累计数 SAMPLE 扫描 
2007-03-26 12:02
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 

题目:训练场上n(1≤n≤50000)个高矮都不相同的士兵从左到右排成一行,依次编号为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 12:02
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
得分:0 

帮你顶上去


雁无留踪之意,水无取影之心
2007-03-26 17:05
玫瑰花的刺
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-3-26
得分:0 

理解有限,没有懂你说的1的累计数和0的累计数是什么意思.能给予解释清楚点吗?

2007-03-26 18:10
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
就是扫描到某处,则前面出现1的总数要比出现0的总数要大.

倚天照海花无数,流水高山心自知。
2007-03-26 21:17
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
得分:0 

题目到是看明白了,但是感觉好象都有点难度,
我要慢慢想


2007-03-26 22:19
hujian100
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2006-9-14
得分:0 

我做的第二题,符合要求。身高是随机生成的,只是题目要求的数值范围太大了吧。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define len 50000

void main()
{
int i,j,k=0,sum=0,n,s[len]={0};
long int h[len]={0};
printf("Input the number of soldier(1<=n<=50000):");
scanf("%d",&n);
srand(time(NULL));
for(i=0;i<n;i++)
{
h[i]=rand();
printf("%d ",h[i]);
}
printf("\n");
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(h[i]<h[j])
{
s[k]=j-i-1;
sum+=s[k];
k++;
break;
}
}
if(j==n)
{
s[k]=j-i-1;
sum+=s[k];
k++;
}
}
printf("The sum is %d.\n",sum);
}

[此贴子已经被作者于2007-3-26 23:19:55编辑过]


2007-03-26 22:36
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
得分:0 
我觉得楼上要改一下,
首先身高说是在那个范围内的话数组应该至少要个long int吧?
如果用long int;就不知道要多少内存,如果输入的数真的是50000的话应该要50000!次循环,
有点多,

2007-03-26 22:46
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
得分:0 

发现我写的有点问题,改一下再发上来

[此贴子已经被作者于2007-3-28 17:42:24编辑过]


2007-03-27 10:02
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
得分:0 

要想解决数组的大内存问题我想用文件来保存数据,
因为这个数组同一时刻只用了最后两个数据,所以我的思路是:
用fputc()把身高写到文件中,在用fgetc()从后面读取数据那么最后人的身高就是:
while(知道读到空格)
{h[i]=(ch-'0')*i;
i*=10},见鬼的是我死活没有办法由后面往前面读取字符,
高手救我:
#include<stdio.h>
#include<conio.h>
void main()
{
FILE *fp1,*fp2;
long int n,sum=0;
long int last,next;
char ch;
fp1=fopen("1.txt","w+");
fp2=fp1;
if(fp1==NULL)
printf("erro");
else
{
scanf("%ld",&n);
ch=getch();
while(ch!=13)
{
fputc(ch,fp1);
ch=getch();
}
}
fp1--;/*指针前移一位*/
ch=fgetc(fp1);
while(fp1!=fp2)
{
ch=fgetc(fp1);/*这个地方有问题,我没有办法读取正确的字符*/
if(ch!=' ')
{next=(ch-'0')*i;
i*=10;
fp1-=2;/*由于fgetc在读取的时候指针自动后移一位所以就是减2*/
}
else
{
i=1;
last=next;
next=0;
}
}

}


2007-03-27 10:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-126858-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.856372 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved