沫璃发起了一场交易,她将她的5个朋友聚在一起准备进行一场交易。交易开始前,大家各有b(b>0)个硬币,交易后,每个人有ai个硬币。由于硬币不方面携带,在交易过程中可能会丢失。现在沫璃想知道是否一定丢失

原题题目重现:

沫璃发起了一场交易,她将她的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这种特殊情况考虑到就好了。

收获:

在考虑问题的时候,一定要仔细阅读要求的限制条件,特别要注意特殊极端的情况,例如取值范围的端点问题等。

本博客长期更新,时刻回答疑难评论;转发请标记本博客网址,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值