2000.5请你编程
本人用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提供。