有一道竞赛试题,请大家指教指教。
ACM分组
时限:1000MS 内存限制:10000K 总时限:3000MS
描述
ACM组织正在考虑一个新的区域赛的参赛分组规则。因为每次比赛中都有把参赛队的三个成员的名字做在一个表示牌上,现在采用的方法是如果某个队员的名字很长,就用字体小的字,相反长度短的名字用字体大的字。可是经过几次尝试,发现效果并不是很好,决定采用新的规则--“参赛队中的每个队员名字的长度与整个队所有成员的名字平均长度的差值小于等于2”。采用这样的规则,一个由MAHERSHALALHASHBAZ,AL和BILL组成的参赛队是不被接受的。而MAHERSHALALHASHBAZ,NEBUCHADNEZZAR和BILLYBOBBENJAMIN组成的参赛队是被接受的。
给定n个学生的名字,判断他们是否能够组成每组有k个队员的可被接受的参赛队。
输入
输入包含多个测试数据。每组数据的第一行是n和k,n <=1000,k <=8并且n可被k整除。接下来是n行,每行是一个由大写字母组成的名字,名字中没有空格出现,每个名字长度不超过80个字母。最后一组数据是两个0,对其不做处理。
输出
对每一组数据按样例输出的格式输出 "yes "或 "no ", "yes "表示可以将n个学生分为每组k人的参赛队。否则为 "no "。注意每一组数据的输出结果后输出一个空行。
输入样例
3 3
MAHERSHALALHASHBAZ
AL
BILL
6 3
MAHERSHALALHASHBAZ
AL
NEBUCHADNEZZAR
BILL
BILLYBOBBENJAMIN
JILL
0 0
输出样例
Case 1: no
Case 2: yes
下面是我的答案:
#include <stdio.h> // 问题是要求对M个队员组成K组;要求每组队员的姓名长度
#include <math.h> //与平均姓名长度的差不大于2
struct List
{
char name[80];
struct *next;
};
typedef struct List node;
typedef node *link ;
void main()
{
link head;
link pointer;
link back; //指向上一接点
link New;
int m,k,i; //M K 为输入数据 I为循环变量
int count=0; //记数
re:scanf( "%d%d ",&m,&k);
while(m!=0 && k!=0)
if(m%k != 0)
{
printf( "wrong input ,reinput "); //输入不符合 重新输入
goto re;
}
else
{
head = (link)malloc(sizeof(node)); //将姓名加入链表
pointer = head;
head-> next = NULL;
scanf( "%s ",head-> name);
for(i=1;i <m;i++)
{
New = (link)malloc(sizeof(node));
pointer-> next = New;
scanf( "%s ",pointer-> name);
pointer-> next = NULL;
}
pointer-> next = head; //建立循环链表
back = head;
pointer = head-> next;
while(pointer!=head) //查看是否符合要求
{
New = pointer-> next;
while(New-> next!=pointer)
{
if(pointer-> name - New-> name <2 || New-> name-pointer-> name <2)
{
count++;
New= New-> next;
}
else
New= New-> next;
}
if(count = (m/k))
{
pointer = pointer-> next;
continue;
}
else
{
printf( "no ");
break;
}
pointer= pointer-> next;
}
printf( "yes ");
scanf( "%d%d ",&m,&k); //进入下一操作
}
}
[解决办法]
楼主给的真的是2分吗?
[解决办法]
问: 用数组不符合要求吗??