题目链接:Family planning
题意是这样的:国家政策允许某一个家庭有M个孩子,但是当他没超生的情况下有了儿子,那么之后的孩子都算超生。
如果允许的范围内没剩下儿子,那么超生的也要罚款。
罚款规则是,第一个10000 RMB,第二个是20000 RMB,第三个是40000 RMB ...也就是一个等比数列求和的问题了。
然后有点值得注意的是,金额会超出int 的范围,可以使用long来计算,或者使用之后加上“0000”。
我这里给出两种解法。
下面AC代码:
import java.util.Scanner;
//我建议还是使用第一种,比较简便,容易理解一点
public class Main{
private static Scanner scanner;
public static void main(String[] args) {
scanner = new Scanner(System.in);
int num = scanner.nextInt();
while (num-- > 0) {
int m = scanner.nextInt();// 允许生几个
int n = scanner.nextInt();// 实际生了几个
long sum = 0;// 钱
int arr[] = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
boolean boo = false;
if (m <= n) {//超生
// 如果允许生的孩子里有儿子,则该儿子后的不管男女,都罚款
for (int i = 0; i < m; i++) {
if (arr[i] == 1) {
sum = pow(2, n - i - 1) - 1;
boo = true;
break;
}
}
if (!boo) {// 如果允许生的孩子里没有儿子,按超生来算
sum = pow(2, n - m) - 1;
boo = true;
}
} else {//没超生
for (int i = 0; i < n; i++) {
if (arr[i] == 1) {
sum = pow(2, n - i - 1) - 1;
break;
}
}
}
System.out.println(sum * 10000 + " RMB");
}
}
private static int pow(int a, int b) {
// a的b次方
int s = 1;
for (int i = 0; i < b; i++) {
s *= a;
}
return s;
}
}
/*
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while(t-->0){
int n =sc.nextInt();
int m = sc.nextInt();
int child[] = new int[m];
for(int i=0;i<m;i++){
child[i] = sc.nextInt();
}
long fine = 0;
long excess = 1;
//第一种情况,生下的孩子数量比规定最多的数量要少或者一样
//则只有在生出男孩之后才能罚款;
if(m<=n){
boolean isGirl = true;
for(int i=0;i<m;i++){
if(child[i]==1&&isGirl){
isGirl=false;
continue;
}
if(!isGirl){
fine+=excess;
excess*=2;
}
}
}else{
boolean isGirl = true;
for(int i=0;i<n;i++){
if(child[i]==1&&isGirl){
isGirl=false;
continue;
}
if(!isGirl){
fine+=excess;
excess*=2;
//System.out.println("!!!fine="+fine+",,"+"excess="+excess);
}
}
for(int j=n;j<m;j++){
fine+=excess;
excess*=2;
//System.out.println("fine="+fine+",,"+"excess="+excess);
}
}
if(excess==1){
System.out.println("0 RMB");
}else{
System.out.println(fine+"0000 RMB");
}
}
}
}*/