题目描述:
银行会互相借钱。在经济艰难时期,如果一个银行倒闭,它就不能偿还贷款。一个银行的总资产是它当前的余款减去它欠其他银行的贷款。下图就是五个银行的状况图。每个银行的当前余额分别是 2500 万美元、1 亿 2500 万美元、1 亿 7500 万美元、7500 万美元和 1 亿 8100 万美元。从节点 1 到节点 2 的方向的边表示银行 1 借给银行 2共计 4 千万美元。
如果银行的总资产在某个限定范围以下,那么这个银行就是不安全的。它借的钱就不能返还给借贷方,而且这个借贷方也不能将这个贷款算入它的总资产。因此,如果借贷方总资产在限定范围以下,那么它也不安全。编写程序,找出所有不安全的银行。程序如下读取输入。它首先读取两个整数 n 和 limit,这里的 n 表示银行个数,而 limit 表示要保持银行安全的最小总资产。然后,程序会读取描述 n 个银行的 n 行信息,银行的 id 从0 到 n-1。每一行的第一个数字都是银行的余额,第二个数字表明从该银行借款的银行,其余的就都是两个数字构成的数对。每对都描述一个借款方。每一对数字的第一个数就是借款方的 id,第二个数就是所借的钱数。例如,在上图中五个银行的输入如下所示(注意:limit 是 201):
银行 3 的总资产是 75+125,这个数字是在 201 以下的。所以,银行 3 是不安全的。在银行 3 变得不安全之后,银行 1 的总资产也降为125+40。所以,银行 1 也不安全。程序的输出应该是:
Unsafe banks are 3 1
提示:使用一个二维数组 borrowers 来表示贷款。borrowers[i][j]表明银行 i 贷款给银行 j的贷款额。一旦银行:j 变得不安全,那么 borrowers[i][j]就应该设置为 0。
代码:
import java.util.Scanner;
public class Test30 {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
int bank_number = in.nextInt(); //银行数量
double limit = in.nextDouble(); //限定资金
double[][] borrowers = new double[bank_number][bank_number]; //贷款数组
double[] total_assets = new double[bank_number]; //总资产
double[] balance = new double[bank_number]; //余额数组
inputBanksInformations(balance,borrowers);
computeTotalAssets(total_assets,balance,borrowers,limit);
printUnsafeBanks(total_assets,limit);
in.close();
}
//输入银行信息
public static void inputBanksInformations(double[] balance,double[][] borrowers)
{
for(int i = 0; i < balance.length; i++)
{
balance[i] = in.nextDouble();
int borrowers_number = in.nextInt();
for(int j = 0; j < borrowers_number; j++)
borrowers[i][in.nextInt()] = in.nextDouble();
}
}
//计算银行总资产
public static void computeTotalAssets(double[] total_assets,double[] balance,double[][] borrowers,double limit)
{
int[] flag = new int[total_assets.length];
for(int num = 0; num < total_assets.length; num++)
{
for(int i = 0; i < total_assets.length; i++)
{
total_assets[i] = balance[i];
for(int j = 0; j < borrowers[i].length; j++)
total_assets[i] += borrowers[i][j];
}
for(int i = 0; i < total_assets.length; i++)
{
if(total_assets[i] < limit && flag[i] != 1)
{
total_assets[i] = 0;
for(int j = 0; j < total_assets.length; j++)
borrowers[j][i] = 0;
flag[i] = 1;
}
}
}
}
//打印不安全的银行
public static void printUnsafeBanks(double[] total_assets,double limit)
{
int flag = 0;
System.out.print("Unsafe banks are ");
for(int i = 0; i < total_assets.length; i++)
{
if(total_assets[i] < limit)
{
System.out.print(i+" ");
flag = 1;
}
}
if(flag == 0)
System.out.println("No bank is unsafe");
else
System.out.println();
}
}