百度首页 | 百度空间
 
查看文章
 
^_^,给一些初赛的题,给大家练练手:)
2007-05-18 12:20

咳咳,隆重发布。。。共四题(100分)

第一题:连续正整数(10分)

题目描述:
一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。

输入数据:一个正整数,以命令行参数的形式提供给程序。


输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出“NONE”。
例如,对于15,其输出结果是:
1 2 3 4 5
4 5 6
7 8
对于16,其输出结果是:
NONE
评分标准:
程序输出结果是否正确。

第二题:重叠区间大小(20分)

题目描述:
请编写程序,找出下面“输入数据及格式”中所描述的输入数据文件中最大重叠区间的大
小。
对一个正整数n,如果n在数据文件中某行的两个正整数(假设为A和B)之间,即A< =n
<=B或A>=n>=B,则n属于该行;如果n同时属于行i和j,则i和j有重叠区间;重叠区间的大
小是同时属于行i和j的整数个数。
例如,行(10 20)和(12 25)的重叠区间为[12 20],其大小为9;行(20 10)和(
12 18)的重叠区间为[10 12],其大小为3;行(20 10)和(20 30)的重叠区间大小为1。

输入数据:
程序读入已被命名为input.txt的输入数据文本文件,该文件的行数在1到1,000,000之间,
每行有用一个空格分隔的2个正整数,这2个正整数的大小次序随机,每个数都在1和2^32-
1之间。(为便于调试,您可下载测试input.txt文件,实际运行时我们会使用不同内容的
输入文件。)


输出数据:
在标准输出上打印出输入数据文件中最大重叠区间的大小,如果所有行都没有重叠区间,
则输出0。
评分标准:
程序输出结果必须正确,内存使用必须不超过256MB,程序的执行时间越快越好。

第三题:字符串替换(30分)

题目描述:请编写程序,根据指定的对应关系,把一个文本中的字符串替换成另外的字符串。

输入数据:程序读入已被命名为text.txt和dict.txt的两个输入数据文本文件,text.txt为一个包含大量字符串(含中文)的文本,以whitespace为分隔符;dict.txt为表示字符串(s1)与字符串(s2)的对应关系的另一个文本(含中文),大约在1万行左右,每行两个字符串(即s1和s2),用一个\t或空格分隔。dict.txt中各行的s1没有排序,并有可能有重复,这时以最后出现的那次s1所对应的s2为准。text.txt和dict.txt中的每个字符串都可能包含除whitespace之外的任何字符。text.txt中的字符串必须和dict.txt中的某s1完全匹配才能被替换。(为便于调试,您可下载测试text.txt和dict.txt文件,实际运行时我们会使用不同内容的输入文件。)

输出数据:在标准输出上打印text.txt被dict.txt替换后了的整个文本。 评分标准:程序输出结果必须正确,内存使用越少越好,程序的执行时间越快越好。

第四题:低频词过滤(40分)

题目描述:请编写程序,从包含大量单词的文本中删除出现次数最少的单词。如果有多个单词都出现最少的次数,则将这些单词都删除。

输入数据:程序读入已被命名为corpus.txt的一个大数据量的文本文件,该文件包含英文单词和中文单词,词与词之间以一个或多个whitespace分隔。(为便于调试,您可下载测试corpus.txt文件,实际运行时我们会使用不同内容的输入文件。)

输出数据:在标准输出上打印删除了corpus.txt中出现次数最少的单词之后的文本(词与词保持原来的顺序,仍以空格分隔)。 评分标准:程序输出结果必须正确,内存使用越少越好,程序的执行时间越快越好。


类别:百度之星历年题目 | 添加到搜藏 | 浏览() | 评论 (81)
 
最近读者:
 
网友评论:
1
2007-05-18 15:11
呃。。除了第二题想不出好算法。。其余的还算简单。。
 
2
2007-05-18 15:28
第一替我是这样编的,不知道能打多少分。
帮忙评评吧。
#include <stdio.h>
main(int n,char *str[])
{ int i,j,t,s,k,num;
for(i=1;i<=n-1;i++)
{ num=0;
for(j=1;j<atoi(str[i])/2;j++)
{ t=j;s=j;
while(s<atoi(str[i]))s+=++t;
if(s==atoi(str[i]))
{ for(k=j;k<=t;k++)printf("%d ",k);
printf("\n");
++num;
}
}
if(num==0)printf("NONE\n");
printf("\n");
}getch();
}
 
3
2007-05-18 15:31
初赛就这么些题目吗?
 
4
2007-05-18 17:46
这是第二题的源代码,好像有点漏洞,请帮忙改一下。

#include <stdio.h>
unsigned long p(unsigned long,unsigned long ,unsigned long ,unsigned long ,unsigned long );
main()
{ FILE *fp;
unsigned long x[2],y[2],i,j,max=0;
if((fp=fopen("input.txt","r"))==NULL)
{ printf("This file cannot be opened.");
exit(1);
}
for(i=1;i<=1000000;i++)
{ rewind(fp);
for(j=2;j<=i;j++)
{ while(fgetc(fp)!='\n'){};
}
if(feof(fp))break;
fscanf(fp,"%lu %lu",&x[0],&x[1]);if(feof(fp))break;
while(fgetc(fp)!='\n'){};
do
{ fscanf(fp,"%lu %lu",&y[0],&y[1]);
max=p(x[0],x[1],y[0],y[1],max);
}while(!feof(fp));
}
fclose(fp);
printf("%lu",max);getch();
}

unsigned long p(unsigned long x0,unsigned long x1,unsigned long y0,unsigned long y1,unsigned long max)
{
unsigned long t,ma,mi;
if(x0>x1){t=x1;x1=x0;x0=t;}
if(y0>y1){t=y1;y1=y0;y0=t;}
if(y1>x1)ma=x1;
else ma=y1;
if(y0<x0)mi=x0;
else mi=y0;
if(ma>max+mi)return
 
5
2007-05-19 07:30
还好了,并不难嘛,尤其是第一题和第三题,上课都讲过~~~~第二题相对较难
 
6
2007-05-19 14:12
足迹
 
7
2007-05-19 18:00
汗。。。。不难啊
 
8
2007-05-19 18:11
4楼的程序没有贴完。。。。。
o(n2)的效率肯定超时
 
9
2007-05-19 18:20
麻烦给下数据。
 
10
2007-05-19 19:39
为什么都没有数据范围...
 
11
2007-05-19 20:36
【qq群】参赛者请加入3093233qq群,方便交流
 
12
2007-05-19 22:02
呵呵,C语言的
 
13
2007-05-19 22:23
第二个我有一个超高效的算法,但是我的C语言太差劲了,半天都在输入输出和内存上出错,根本就不给我展示的机会啊!真是“工欲善其事必先利其器”。现在后悔没早点搞定C啊,一直都是入门级。希望大家别像我这样啊!
 
14
2007-05-19 22:57
输入数据:一个正整数,以命令行参数的形式提供给程序。

这是要求如何写?我没用过
 
15
2007-05-19 22:58
第二题O(nlogn)应该比较优了吧。
 
16
2007-05-19 23:14
第一题:
#include <iostream>
#include <cmath>
using namespace std;

int main(int argc, char** argv)
{
float a1 = 0.0;
bool isok = false;
int n = atoi(argv[1]);

for(int i = (int)(sqrt(8*n + 1)-1)/2; i >= 2; i--)
{
a1 = (float)n/i - (i-1)/2.0;
if((int)a1 == a1)
{
for(int k=0; k<i; k++)
cout<<a1++<<" ";
cout<<endl;
isok = true;
}
}
if(! isok)
cout<<"NONE";
}

只要一个数不是2的次幂,就可以用连续整数表示!
 
17
2007-05-20 09:52
//第一题:
//#include <cassert>
#include <iostream>
using namespace std;

int main(int argc, char* argv[]) {
int n;
cin >> n;

bool solved = false;
for(int k = 2; k * (k + 1) / 2 <= n; ++k) {
if(k % 2 != 0) { // odd k
if(n % k == 0) {
int start = n / k - k / 2;
// int sum = 0;
for(int i = 0; i < k; ++i) {
cout << start + i << (i == k - 1 ? '\n' : ' ');
// sum += start + i;
}
// assert(sum == n);
solved = true;
}
} else { //even k
if(n % (k / 2) == 0 && n / (k / 2) % 2 != 0) {
int start = n / k - (k / 2 - 1);
// int sum = 0;
for(int i = 0; i < k; ++i) {
cout << start + i << (i == k - 1 ? '\n' : ' ');
// sum += start + i;
}
// assert(sum == n);
solved = true;
}
}
}

if(!solved) {
cout << "NONE\n";
}

return 0;
}
 
18
2007-05-20 10:52
//第三题
#include<fstream>
#include <iostream>
#include <string>
#include <map>

using namespace std;

map<string, string>dict;

int main()
{
string str;

ifstream fin;
fin.open("dict.txt" );

if(! fin)
cout <<"error in open dict.txt";

while(! fin.eof() )
{
fin >> str;
fin >> dict[str];
}

fin.clear();
fin.close();

fin.open("text.txt");

if(! fin)
cout <<"error in open dict.txt";

while(! fin.eof())
{
fin >> str;

if(dict.find(str) != dict.end())
{
cout <<dict[str]<<" ";
}else{
cout <<str<<" ";
}
}
}
 
19
2007-05-20 12:05
MS第三第四题用map和string来写都大概二三十行能搞定
第二题就是sort一次+iterate一次 NlogN + N的复杂度
 
20
2007-05-20 12:21
//第四题
#include<fstream>
#include <iostream>
#include <string>
#include <map>

using namespace std;

map<string, int>dict;

int main()
{
string str;
ifstream fin;
int min = 1;

fin.open("corpus.txt" );

if(! fin)
cout <<"error in open corpus.txt";

while(! fin.eof() )
{
fin >> str;
if(dict.find(str) != dict.end())
{
dict[str]++;
}else{
dict[str]=1;
}

if( dict[str]<min)
min = dict[str];
}

fin.clear();
fin.close();
fin.open("corpus.txt");

if(! fin)
cout <<"error in open corpus.txt";

while(! fin.eof())
{
fin >> str;
if(dict[str] != min)
{
cout <<str<<" ";
 
21
2007-05-20 14:50
ASTAR2006“变态比赛规则”怎么用DP做?求算法。大牛帮帮忙。可以发到我邮箱里么?谢谢了
 
22
2007-05-20 17:10
太简单了,想不想让一个27岁的电脑程序天才落入你们的手中吗?我可以告诉你们答案哦~~~而且我满怀信心地说:"这四道题我10分钟就能做出来."我绝对没有说谎!但我的眼睛已经100度了哦~~~
 
23
2007-05-20 17:11
想不想让我告诉你们答案?!
 
24
2007-05-20 19:06
#include<iostream.h>
const int arraySize=500;
void main()
{
bool f=true;
//////////////////////////////////////////////////////////////////////////
int n,sum=0;
cout<<"Please enter a integret number:";
cin>>n;
///////////////////给数组负值/////////////////////////////////////////////////////////
int array[arraySize];
for(int i=0;i<arraySize;i++)
array[i]=i+1;
///////////检验程序////////////////////////////////////////////////////////////////////
for(int k=0;k<=n/2+1;k++)
for(i=k;i<=n/2+1;i++)
if(sum<n)
sum+=array[i];
else if(sum==n){
for(int j=k;j<i;j++)
cout<<array[j]<<" ";
cout<<endl;
f=false;
sum=0;
i=n/2+1;
}
else {
sum=0;
i=n/2+1;
}
///////////////////////标记是否有输出////////////////////////////////////////////////////////////////
if(f==true)
cout<<"NONE"<<endl;
}
 
25
2007-05-21 00:35
to gqtoto1234:
初赛的题目做出来又没什么了不起的 炫耀什么
 
26
2007-05-21 09:05
第二题线段树。。。
 
27
2007-05-21 12:13
to gqtoto1234
晕,你会也不用说出来啊,这里谁不会啊
我上小学的小弟都会做
 
28
2007-05-21 17:38
谁能告诉我测试数据在哪下阿?
 
29
2007-05-21 22:26
to gqtoto1234
一看就是垃圾
牛人应该保持低调
何况只是初等选拔的试题
 
30
2007-05-22 09:01
第一题: (num-f(n)) % n == 0 , f(n) = n*(n-1)/2 , n >2 , n < num /2
 
31
2007-05-22 12:55
//在vc6里通过,输入10000000才几秒哦
#include <iostream.h>
#include <time.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <string>
#include <stdio.h>
using namespace std;

int main(int argc ,char ** argv)
{
long double number,flag=0,sum=1;

char str[10];
cout<<"请输入一个任意的整数:\t";
cin>>number;
long double a=number;
_strtime(str);
char t[10];
strcpy(t,str);
a=a/2;
for(long double i=1;i<=a;i++,sum=i)
{

for(long double j=i;j<=a;j++)
{
sum=sum+(j+1);
if(sum>number)break;//这句就是效率呀!!!

if(sum==number)
{
cout<<number<<'=';
for(long double k=i;k<=j;k++)
{
cout<<k<<'+';
}
cout<<k;
cout<<endl;
flag++;
break;//这句也是效率呀!!!
}
}

}

if(flag==0)
{
cout<<"None"<<endl;
}
_strtime(str);
cout<<"计算前的时间 : "<<t<<endl;
cout<<"计算后的时间 : "<<str<<endl;
cout<<"count="<<flag<<endl;
return 0;

}
 
32
2007-05-22 14:07
☆☆★★★★★★★★★★★★★★★★★★★☆☆
 ☆★                   ★☆
 ☆★ 睡得甜甜唷  ★★★   ★★★  ★☆
 ☆★       ★☆☆☆★☆★☆☆☆★ ★☆
 ☆★  ★★   ★★☆☆☆★☆☆☆☆★ ★☆
 ☆★ ★☆☆★ ★★☆★☆☆☆☆☆☆☆★ ★☆
 ☆★ ★☆☆☆★☆☆★★☆☆☆☆☆☆★  ★☆
 ☆★  ★☆☆☆☆☆★★☆☆☆☆☆★   ★☆
 ☆★   ★☆☆☆★  ★☆☆☆★    ★☆
 ☆★    ★☆★     ★      ★☆
 ☆★     ★       快樂每一天 ★☆
 ☆★                   ★☆
 ☆☆★★★★★★★★★★★★★★★★★★★☆☆

http://312323693.qzone.qq.com/

 
33
2007-05-22 22:27
//第一题```输入10000000不要1秒
#include "stdio.h"
int main()
{
double n=2,a;
int m,i,b;
short flag_in,flag_out=0,flag_exist=0;
printf("Input the number:");
scanf("%d",&m);
while(1)
{
flag_in=0;
while(1)
{
a=(2*m-n*n+n)/(2*n);
if(a<1)
{
flag_out=1;
break;
}
else if(a-(int)a<1e-6)//a is a integer...
{
flag_in=1;
break;
}
n++;
}
n++;
b=(int)a;
if(flag_in)
{
for(i=1;i<n;i++)
printf("%d ",b++);
printf("\n");
flag_exist=1;
}
if(flag_out)
break;

}
if(!flag_exist)
printf("NONE");
return 0;
}
 
34
2007-05-22 22:28
我的程序有一点不好大家提一下意见
main()
{
int i,j,k,l=0,s;
int x,xx;
scanf("%d",&i);
for(x=1;x<i;x++)
{s=0;
for(j=x;j<i;j++)
{
s+=j;
if(s==i)
for(k=x;k<=j;k++)
{
l++;
printf("%d",k);
}
}
printf("\n");
}
if(l==0)
printf("nono");

}
 
35
2007-05-23 00:33
第二题的描述中
行(20 10)和(
12 18)的重叠区间为[10 12],其大小为3;
是不是有点问题?
重叠区间应该是[12,18],其大小是7吧。
 
36
2007-05-23 11:38
请问有代码测试的环境吗
在什么地方
 
37
2007-05-24 10:16
35楼

是的哦,是应该是[12,18]
 
38
2007-05-24 10:51
仔细想想能做出来,要是用Java的话或许两个小时还可能完成,但是要是C++就麻烦了:)
 
39
2007-05-24 11:14
35楼
就是啊
为什么 行(20 10)和(12 18)的重叠区间为[10 12],其大小为3 ?
怎么没人能回答呢?????????????????????????
 
40
2007-05-24 12:05
第一题,c++版的
#include <iostream>
using namespace std;
void main()
{
cout<<"请输入一个整数:"<<endl;
int n,i,j,sum=0,a[10],k=0,m;
bool flag=false;
cin>>n;
for(i=1;i<=n/2+1;i++)
{
k=0;
sum=0;
for(j=i;j<=n/2+1;j++)
{
a[k]=j;
k++;
sum=sum+j;
if(sum==n)
{
flag=true;
for(m=0;m<k;m++)
cout<<a[m]<<" ";
cout<<endl;
break;
}
if(sum>n)
break;
}
}
if(!flag)
cout<<"NONE"<<endl;
}
 
41
2007-05-24 14:43
有没有测试数据可以用啊
 
42
2007-05-24 15:59
第四题,我用纯C编写了200多行,用链表来实现。看了楼上的,说只用20行就可以实现我越觉得纳闷。

第一题,用虚拟机运行输入10000000
#include <stdio.h>
#include <stdlib.h>

int
main(int argc,char **argv){
int i,max,n,j,a1;

if(argc!=2){
fprintf(stdout,"You must specify the integer!\n");
exit(1);
}
i=atoi(argv[argc-1]);
if(i%2)
max=i/2+1;
else
max=i/2;
for(n=max;n>1;n--){
if((2*i)%n)
continue;
j=(2*i)/n;
if((j-n>0)&&(j-n)%2){
a1=(j-n+1)/2;
if(!a1)
continue;
for(j=0;j<n;j++)
printf("%d ",a1+j);
printf("\n");
}
}
}
real 0m0.570s
user 0m0.110s
sys 0m0.040s
应该说只有0.15秒
 
43
2007-05-24 17:27
main()
{ int i,j,k=0,n=0,sum=0;\\用C编的,请多指教.
clrscr();
scanf("%d",&i);
for(j=1;j<i/2+i%2;j++)
{printf("\n");
for(n=j,sum=j;sum<=i;n++,sum+=n)
{
if(sum==i)
for(k=j,sum=j;sum<=i;k++,sum+=k)
printf("%d",k); }
}
}

 
44
2007-05-24 21:21
如果能用STL的话确实十分的方便啊,不知道能用不?
 
45
2007-05-24 23:59
有人用cin/cout...唉...叹口气....
 
46
2007-05-25 00:20
为什么不能用cin和cout阿,那不是c++里面的标准输入输出流对象吗?
 
47
2007-05-25 01:03
当然可以用... 只是被人一看就是不专业的
 
48
2007-05-25 10:45
这四题要是用c语言编,2个小时完成,时间太紧了,根本无法完成。
我第二题、第四题总共写了400多行代码,郁闷啊?
这是我第二题的答案,我用的是两个链表来实现的,1000000行数据花了1.7秒
如果用平衡二叉树的话,相信速度更快。
 
49
2007-05-25 10:47
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "linklist.h"

#define BUFFERSIZE 50
#define MAXSPACE(min1,min2,max1,max2) (max2>max1?max1:max2)-(min1>min2?min1:min2)+1

LINKLIST_HEAD(spacehead);
LINKLIST_HEAD(minhead);

struct sphere
{
unsigned int min,max;
unsigned int size;
struct link_list *spacenext,*minnext;
};

void insert_spacehead(struct link_list *head, struct link_list *new){
struct link_list *prev,*pos;
unsigned size;

size=list_entry(new, struct sphere, spacenext)->size;
prev=head;
list_for_each(pos, head){
struct sphere *p=list_entry(pos, struct sphere, spacenext);

if(size<p->size){
list_add(new, prev);
return;
}
prev=pos;
}
list_add(new, prev);
return;
}
 
50
2007-05-25 10:48
void del_spacehead(struct link_list *head, unsigned int maxspace){
struct link_list *pos,*n;

list_for_each_safe(pos, n, head){
struct sphere *p=list_entry(pos, struct sphere, spacenext);

if(p->size<maxspace){
list_del(pos, head);
list_del(p->minnext,&minhead);
}
else
return;
}
}
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu