首页 > 技术文章 > Luogu T136006题解

PYD1 2020-08-19 12:50 原文

题目

T136006【第二站】《三体》

题意

输入\(n\)\(m\)以及接下来的\(n\)个数,求出这\(n\)个数的平均值以及平均值\(\times m\)的结果

解题步骤

  • 先读入\(n\)\(m\)
cin >> n >> m;
  • 由于题目中的输入数据的数量是不固定的(由\(n\)来决定),所以我们输入的时候需要使用到循环(循环\(n\)次进行输入)。我们可以用\(i\)作为循环变量,让\(i\)\(1\)\(n\)进行循环,每次循环的过程中读入一个数,最终就可以实现读入\(n\)个数的效果:
for (int i = 1;i <= n;i++){
	cin >> a;
}
  • 因为最终要求的是这\(n\)个数的平均数,所以我们在读入的时候定义一个新变量\(sum\),顺便计算这\(n\)个数的和,最后\(sum \div n\)即可:
for (int i = 1;i <= n;i++){
	cin >> a;
	sum = sum + a;
}
  • 因为题目最下方的数据范围告诉我们最终平均数是一个整数,所以不需要使用\(double\)或者\(float\),要求平均数,直接输出\(sum \div n\)
cout << sum / n;
  • 但是,题目中还让输出能航行的光年数,根据“题意”中的分析,应该再输出\(sum \div n \times m\)
cout << sum / n << " " << sum / n * m;

注意事项

  • 根据题目数据范围,\(sum\)的最大值应该是\(1000 \times 10000000 = 10^{10} > 2^{31}-1\),也就是说,\(sum\)的最大值是比\(int\)数据类型能存储的最大值还要大的,因此,我们需要将\(sum\)变量定义为\(long long\)类型,否则就可能会出现数据溢出的情况:
long long sum;
  • 输出的时候要严格按照输出样例来,不要忘了中间的空格

完整代码(std)

#define isdigit(x) ((x) >= 48 && (x) <= 57)

#include <bits/stdc++.h>
using namespace std;

int n,m,a;
long long sum;

int read(){
	char c = getchar();
	int res = 0;
	while (!isdigit(c)) c = getchar();
	while (isdigit(c)) res = (res << 1) + (res << 3) + c - 48,c = getchar();
	return res;
}

int main(){
	n = read(),m = read();
	for (register int i = 1;i <= n;i++) a = read(),sum += a;
	printf("%d %d",sum / n,sum / n * m);
	return 0;
}

上面的代码运用了一些奇怪的技巧,下面是没有特殊技巧的代码:

#include <bits/stdc++.h>
using namespace std;

int n,m,a;
long long sum;

int main(){
	cin >> n >> m;
	for (int i = 1;i <= n;i++){
		cin >> a;
		sum = sum + a;
	}
	cout << sum / n << " " << sum / n * m;
	return 0;
}

推荐阅读