2000.5请你编程

Author: oldbug Date: 2000年 第20期

    大家好!《请你编程》又与你们见面了。《请你编程》得到了广大朋友的关心和支持,我在这里表示衷心的感谢。《请你编程》是一个读者朋友直接参与的栏目,是一个体现自我的园地,希望有编程愿望的朋友,无论是编程高手,还是初学者都能参与进来,我们将会认真对待每一份作品。下面请看2000.1期磐安读者马拥军的程序。
  本人用Turbo c 2.0编程实现了题目的要求其解题思路如下:
  6×6的箱子有以下几种装法:(1)装6×6产品1只;(2)装5×5产品1只,并且能装1×1产品11只;(3)装4×4产品1只,并且能装2×2产品5只;(4)装3×3产品4只;(5)装2×2产品9只;(6)装1×1产品36只;为了节约箱子,应尽可能先把大的产品装掉,再装小的产品。源程序如下:
  #include<stdio.h>
  main()
  {int a[7];
  void fun();
  FILE *fp;
  if((fp=fopen(″packets.txt″,″r″))==NULL)
   {printf(″can not open packets.txt!\n″);
   exit(0);}
  while(fscanf(fp,″%d%d%d%d%d%d″,&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])==6)
  fun(a); /*a[1]到a[6]分别用于存放1×1到6×6产品的个数*/
  fclose(fp);}
  void fun(int *m)
  {if(m[2]>=5*m[4]) /*若2×2的产品数大于4×4产品数的5倍,则4×4产品装剩下的空间*/
  m[2]-=5*m[4];  /*可全部用于装2×2的产品,否则一部分可用于装2×2的产品一部分*/
  else /*可用于装1×1的产品*/
  m[1]-=20*m[4]-4*m[2],m[2]=0;
  switch(m[3]%4) /*3×3的产品装剩下的空间可用于装2×2和1×1的产品*/
  {case 0:
  m[3]/=4;
  break;
  case 1:
  m[3]=m[3]/4+1;
  if(m[2]>=5)
  m[2]-=5,m[1]-=7;
  else
  m[1]-=27-m[2]*4,m[2]=0;
  break;
  case 2:
  m[3]=m[3]/4+1;
  if(m[2]>=3)
  m[2]-=3,m[1]-=6;
  else
  m[1]-=18-m[2]*4,m[2]=0;
  break;
  case 3:
  m[3]=m[3]/4+1;
  if(m[2]>=1)
  m[2]--,m[1]-=5;
  else
  m[1]-=9-m[2]*4;
  break; }if(m[2]%9!=0) /*若剩下的2×2产品的数量不是9的倍数,则装剩下的空间可用于*/
  m[1]-=36-4*(m[2]%9),m[2]=m[2]/9+1; /*装1×1的产品*/
  else
  m[2]/=9;
  m[1]-=11*m[5];
  if(m[1]<0)
  m[1]=0;
  else
  m[1]=m[1]%36?m[1]/36+1:m[1]/36;
  m[0]=m[1]+m[2]+m[3]+m[4]+m[5]+m[6];
  printf(″%d\n″,m[0]); }
  本期请你编程题目
  某国足球队屡战屡败,深深地伤透了全体球迷的心。痛定思痛,该国从国外“聘”一台超级电脑——“BLACK”当球队主教练。这台电脑对足球排兵布阵有自己的理解:它把所有球员按防守能力、组织能力、进攻能力三个方面进行打分,并把一个阵法中所有参加防守的队员的防守分、参加组织的队员的组织分、参加进攻的队员的进攻分都加起来作为该阵法的分数。“BLACK”主教练宣称,它要用得分最高的阵法作为下次出赛的主力阵容。
  例如:如果“BLACK”要挑防守队员、组织队员、进攻队员各1名。现在有3个队员:A,B,C,他们的防守得分、组织得分、进攻得分分别是A:0、0、0;B:100、50、0;C:30、100、10。所以,最佳的阵法是:防守:B(100)+组织:C(100)+进攻:A(0),这样的阵法得分是200分,是最高的。
  现在,“BLACK”对球员的打分出来了,就请你也来当一次主教练,排一下阵法。
  输入:数据从文本文件football.txt中获得,输入数据格式为:
  1.第一行是4个整数:N、A、B、C,整数间用空格分开。其中N表示有N名球员供挑选、A表示要A名防守队员,B表示要B名组织队员、C表示要C名进攻队员。
  2.以下为2*N行,每2行为一个队员的数据:其中第1行为队员名字,最长8个字符;第2行为3个整数I、J、K,依次表示该队员防守、组织、进攻3方面的得分,整数间用空格分开。
  输出:到电脑屏幕,输出格式为A+B+C+1行,前A+B+C每行为一个阵法球员信息(名字、位置、该位置得分)。最后一行输出该阵法的总分。
  输入范例:
  3 1 1 1
  A
  0 0 0
  B
  100 50 0
  C
  30 100 10
  输出范例:
  A:进攻:0
  B:防守:100
  C:组织:100
  阵法总分:200
  本期题目由上海的oldbug提供。