| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 1478 人关注过本帖
标题:[讨论]第九次编程题目,谢谢大家的支持.继续关注.
收藏  订阅  推荐  打印 
nuciewth
Rank: 12Rank: 12Rank: 12
来自:我爱龙龙
等级:版主
威望:93
帖子:9521
积分:95068
注册:2006-5-23
[讨论]第九次编程题目,谢谢大家的支持.继续关注.

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-3-26 12:02
nuciewth
Rank: 12Rank: 12Rank: 12
来自:我爱龙龙
等级:版主
威望:93
帖子:9521
积分:95068
注册:2006-5-23

题目:训练场上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-3-26 12:02
PcrazyC
Rank: 12Rank: 12Rank: 12
等级:贵宾
威望:25
帖子:5594
积分:57167
注册:2006-10-20

帮你顶上去


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

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

2007-3-26 18:10
nuciewth
Rank: 12Rank: 12Rank: 12
来自:我爱龙龙
等级:版主
威望:93
帖子:9521
积分:95068
注册:2006-5-23

就是扫描到某处,则前面出现1的总数要比出现0的总数要大.

倚天照海花无数,流水高山心自知。
2007-3-26 21:17
crackerwang
Rank: 4
等级:高级会员
威望:8
帖子:835
积分:8452
注册:2007-2-14

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


2007-3-26 22:19
hujian100
Rank: 2
等级:注册会员
帖子:69
积分:800
注册:2006-9-14

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

#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-3-26 22:36
crackerwang
Rank: 4
等级:高级会员
威望:8
帖子:835
积分:8452
注册:2007-2-14

我觉得楼上要改一下,
首先身高说是在那个范围内的话数组应该至少要个long int吧?
如果用long int;就不知道要多少内存,如果输入的数真的是50000的话应该要50000!次循环,
有点多,

2007-3-26 22:46
crackerwang
Rank: 4
等级:高级会员
威望:8
帖子:835
积分:8452
注册:2007-2-14

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

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


2007-3-27 10:02
crackerwang
Rank: 4
等级:高级会员
威望:8
帖子:835
积分:8452
注册:2007-2-14

要想解决数组的大内存问题我想用文件来保存数据,
因为这个数组同一时刻只用了最后两个数据,所以我的思路是:
用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-3-27 10:15
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.067430 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved