HDOJ2103 Family planning

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

        }
    }
}*/



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值