题目链接: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");}}}
}*/