Gym-101028E Teams

题目传送门:http://codeforces.com/gym/101028/problem/E

题意:
    ACM-SCPC-2017即将到来每所大学都在努力争取成为冠军,有n所大学,其中的第i个参赛者完全是ai。 没有人知道每支球队的官方参赛人数是多少,今年组织者计划尽量减少参加比赛的球队数量,但他们仍然希望每个参赛者都参加,所以他们应该选择一个数字k,这样每个球队都会 由来自同一所大学的k个参赛者组成。 每个参赛者将完全属于一个团队,这些团队的数量尽可能少。
    你的工作是通过编写一个程序来帮助组织者完成他们的任务,该程序计算两个整数k,每个团队中的参赛者数量以及m,参赛队的最小数量。 1≤n≤1000,1≤ai≤10的6次方
解题思路:思路很容易想到,每个团队的参赛者数量就是所有学校参与者人数的最大公约数(gcd),队伍的最小数量就是总人数除以该最大公约数。
    下面放一段我最初写的代码:  
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1010;
int team[maxn];
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
int main()
{
	int n,m;
	scanf("%d",&n);
	while(n--)
	{
		int result=1,sum=0;
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			scanf("%d",&team[i]);
			sum+=team[i];
		}
		result=gcd(team[0],team[1]);
		for(int i=2;i<m;i++)
		result=gcd(result,team[i]);
		printf("%d %d\n",result,sum/result); 
	}
	return 0;
}

以下为测试结果: 
边界样例:

乍一看好像没什么问题。。。但结果是:wrong answer on test 2
最开始我一直没发现错误在哪,请朋友帮忙看了看,他建议我加一个特判进去【我们俩之前因为边界样例测试,一直认为不需要特判】然后就有了以下代码: 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e5+50;
int team[maxn];
int gcd(int a,int b){  
    return b==0?a:gcd(b,a%b);  
}  
int main()
{
	int n,m;
	scanf("%d",&n);

	while(n--)
	{
		int result,sum=0;
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			scanf("%d",&team[i]);
			sum+=team[i];
		}
		if(m==1)
		{
			printf("%d 1\n",team[0]);
			continue;
		} 
		result=gcd(team[0],team[1]);
		for(int i=2;i<m;i++)
		result=gcd(result,team[i]);
		printf("%d %d\n",result,sum/result); 
 
	}
	return 0;
}

emmm······结果AC了

然而根据第一段代码再看下面这组测试:
结果和之前不一样呢,经检查,发现team数组没有清零,于是有了下面这个版本: 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1010;
int team[maxn];
int gcd(int x,int y)
{
	if(y==0) return x;  
    else return(gcd(y,x%y));
}
int main()
{
	int n,m;
	scanf("%d",&n);
	while(n--)
	{
		memset(team,0,sizeof(team));
		int result=1,sum=0;
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			scanf("%d",&team[i]);
			sum+=team[i];
		}
		result=gcd(team[0],team[1]);
		for(int i=2;i<m;i++)
		result=gcd(result,team[i]);
		printf("%d %d\n",result,sum/result); 
	}
	return 0;
}
当然,还有一种可以避免这些问题的方式:直接令result=team[0]。 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1010;
int team[maxn];
int gcd(int x,int y)
{
	if(y==0) return x;  
    else return(gcd(y,x%y));
}
int main()
{
	int n,m;
	scanf("%d",&n);
	while(n--)
	{
		int result=1,sum=0;
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			scanf("%d",&team[i]);
			sum+=team[i];
		}
		result=team[0];
		for(int i=1;i<m;i++)
		result=gcd(result,team[i]);
		printf("%d %d\n",result,sum/result); 
	}
	return 0;
}
总的来说,还是细节上的处理不够到位,有待加强······

猜你喜欢

转载自blog.csdn.net/qq_41279172/article/details/80639992