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
题目:训练场上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
我做的第二题,符合要求。身高是随机生成的,只是题目要求的数值范围太大了吧。
#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编辑过]
要想解决数组的大内存问题我想用文件来保存数据,
因为这个数组同一时刻只用了最后两个数据,所以我的思路是:
用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;
}
}
}