原题题目重现:
沫璃发起了一场交易,她将她的5个朋友聚在一起准备进行一场交易。交易开始前,大家各有b(b>0)个硬币,交易后,每个人有ai个硬币。由于硬币不方面携带,在交易过程中可能会丢失。现在沫璃想知道是否一定丢失硬币,或者在可能没有丢失硬币的情况下,交易前每个人的硬币数b。沫璃只是组织者,不参与交易。
输入:
第一行一个数T(T<=100),表示数据组数。对于每组数据,第一行5个整数,第i个整数ai表示交易后第i个朋友的硬币数 (0<=ai<=100)
输出:
对于每组数据,输出一行,若一定丢失硬币输出-1,若可能没有丢失硬币,输出b
样例输入:
2
2 5 4 0 4
4 5 9 2 1
样例输出:
3
-1
分析:
从控制台读入的第一行数据(这个数据数值假设用k表示),表示这个游戏独立重复的做k次(每次都是重新开始,互不相关);下面紧接着从控制台读入k行数据,每行数据的个数(假设用num表示)表示有num个小伙伴一起玩游戏,每行代表交换后对应小伙伴手中的硬币数;计算每一行数据数值相加的总和(假设用sum表示),如果 sum除以num余数为零(即能够被整除,商就是平均值,用ave表示),则表示最初若这num个小伙伴初始时手中有ave个硬币,在这种情况下就能保证没有丢失硬币(题目要求说,若可能没有丢失硬币,输出初始时每个小伙伴手中的硬币数),所以输出ave;如果 sum除以num余数不为零(即不能够被整除),则就不能均分给每个小伙伴,在这种情况下就不能保证初始时每个小伙伴手中有相等数量的硬币,所以输出-1;
源代码(上传后得分为90):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String readLine = bfr.readLine();
int data_account = Integer.parseInt(readLine);
String[] fist_readLine = bfr.readLine().split(" ");
int len = fist_readLine.length;
String[][] data = new String[data_account][len];
data[0] = fist_readLine;
for (int i = 1; i < data_account; i++) {
data[i] = bfr.readLine().split(" ");
}
bfr.close();
for (int i = 0; i < data_account; i++) {
int sum = 0;
for (int j = 0; j < len; j++) {
sum += Integer.parseInt(data[i][j]);
}
if (sum % len == 0) {
System.out.println(sum / len);
} else {
System.out.println(-1);
}
}
}
}
补充:
今天忽然想到了那10分是丢在哪里了,所以补上:
仔细阅读题目,发现这两句话,第一句“交易开始前,大家各有b(b>0)个硬币”和第二句“ai表示交易后第i个朋友的硬币数(0<=ai<=100)”, ai是可以等于0的,考虑一种极端的情况,假设交易后ai全等于0(这符合第二句的要求),在这种情况下,
sum % len == 0
虽然满足了这个条件,但是此时
sum = 0
所以
sum / len == 0
这样就不满足第一句话的要求了,所以,此时应该输出
-1
而不应该输出(这不符合第一句)
0
结论:
只需要添加一个判断
sum / len == 0 的条件把全部ai等于0这种特殊情况考虑到就好了。
收获:
在考虑问题的时候,一定要仔细阅读要求的限制条件,特别要注意特殊极端的情况,例如取值范围的端点问题等。
本博客长期更新,时刻回答疑难评论;转发请标记本博客网址,