作者:不详 来源:互联网   酷勤网收集 2007-08-18

摘要
  “英特尔杯”全国计算机多核程序设计大赛 复赛试题1、2、3

复赛试题-第一题

问题描述:

从一单精度浮点数串中找出乘积最大的连续的4个浮点数。例如在下列浮点数串[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 5.0, 3.0, 3.0, 2.0, 9.0, 1.0, 2.0]找到[4.05.06.05.0].

命令行:

> answer1 data1.dat

输入文件格式:

含有以二进制形式存放的浮点数的文件, 浮点数数量大概在若干千万。

输出结果:

打印该连续4个单元的首单元序号(以零为起始),以及该连续4个单元的乘积。

程序框架:

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

#include <alloc.h>

int main(int argc, char *argv[])

{

float *farray, product;

struct stat buf;

int num,index;

/********************************/

ifstat(argv[1],&buf))  // get the file size

{

      printf("The file does not exist\n");

exit(0);

}

num = buf.st_size/sizeof(float);

farray = (float *)malloc(buf.st_size);

FILE *fp=fopen(argv[1],"rb");

fread( farray, sizeof(float), num, fp);

fclose(fp);

/********************************/

  

  /*在这里处理数据*/

  

  /********************************/

/*输出结果*/

printf("乘积=%f 首数的序号=%d\n", product, index);

free(farray);

/********************************/

}

复赛试题-第二题

问题描述:

对于给定的矩形R1,R2...Rn,试图将它们放到一个大的矩形区域A中,任意两矩形Ri,Rj不得有重叠,求满足条件的矩形区域A的最小面积。放置过程中允许对矩形进行旋转。

命令行:

> answer2 data2.dat

输入文件格式:

data2.dat的第一行表示矩形的个数,从第二行起的每一行都有两个数字,由空格隔开,分别表示一个矩形的长和宽。示例:

3

5 2

3 2

1 1

输出结果:

打印满足条件的最小矩形区域A的面积。示例:

18

程序框架:

#include<stdio.h>

#include<malloc.h>

int main(int argc, char* argv[])

{

    int num, i, area, *rec; // rec[0],rec[1]为矩形1长和宽,以此类推。

/***************INPUT***************************/

    FILE *fp = fopen(argv[1], "rt");

    fscanf(fp, "%d\n",&num);

    rec = (int*)malloc(sizeof(int)*2*num);

    for(i=0;i<num;i++)

        fscanf(fp, "%d %d\n”,rec+2*i, rec+2*i+1);

    fclose(fp);

/************************************************/

/*在这里处理数据*/

/****************OUTPUT**************************/

    printf("area = %d\n", area);

    free(rec)

}

复赛试题-第三题

问题描述:

    a,b,c,d,e五个城市,假设城市间的道路都是单向的,那么我们用(a,b)表示从城市a到城市b有一条道路。那么这样我们就可以把这五个城市间的道路连通集写成这样:

    R={(a, a), (a, b), (b, d), (d, b), (c, e)}

    表示a->a,a->b,b->d,d->b,c->e各有一条通路。

    然而这种表示方法虽然很直观但是不利于计算机处理。所以人们通常用二值矩阵的形式表示,取矩阵中对应相关元素相交处的值为1,其它地方的的值为0。于是可以得到如下矩阵:

      a  b  c  d  e

   a 1  1  0  0  0

   b 0  0  0  1  0

B =c 0  0  0  0  1

   d 0  1  0  0  0

   e 0  0  0  0  0

根据传递性,如果 a->b, b->c, 则a->c。在以上矩阵中,a与b相连且b与d相连,因为(a,b)和(b,d)在R中,所以可以从a经过一定的路径到达d。   但 (a,d)不在集合R中,这就是隐含关系,我们将包含这些隐含关系的集合记为R+。

    所以R+={(a, a), (a, b), (a, d), (b, b), (b, d), (d, b), (d, d), (c, e)}

    这个集合包含(a, d), (b, b), (d, d)是根据传递性定义(即由a->b, b->d, 推出a->d; b->d, d->b, 推出b->b; d->b, b->d, 推出d->d而来的。描述关系R+的矩阵如下:

       a  b  c  d  e

    a 1  1  0  1  0

    b 0  1  0  1  0

B+ =c 0  0  0  0  1

    d 0  1  0  1  0

    e 0  0  0  0  0

题目的要求就是给定一个 N 维的矩阵 BN <= 1000,求该矩阵的传递闭包B+

命令行:

Ø       answer3 data3.dat

输入文件格式:

data3.dat数据格式如下,其中第一个数 n 表示数据集个数,此后跟随着 n

组测试数据。

示例:

6

0 0 1 0 0 0

0 0 0 1 0 0

0 0 1 0 0 0

1 0 0 0 0 0

1 0 0 0 0 0

0 0 0 1 0 0

输入文件格式:

同上。

程序框架:

#include <omp.h>

#include <stdio.h>

int main()

{

  int n;//n<=1000

  int b[1000][1000];

  int i, j, k;

  /********************************/

  FILE *fp1=fopen("test.dat","rb");

  FILE *fp2;

  fread(&n,sizeof(int),1,fp1);

  fread(b,sizeof(int), n*n,fp1);

  fclose(fp1);

  /********************************/

  

  /*在这里处理数据*/

  

  /********************************/

  /*输出结果*/

  fp2 = fopen("result3.dat","wb");

  fwrite(b,sizeof(int),n*n,fp2);

  fclose(fp2);

  return 0;

  /********************************/

}

分类: IT竞赛比赛 培训考证



关于酷勤 | 联系方式 | 免责声明 | 友情链接