【2010.10.13 10:00 携程校招笔试】买可乐(50%)、派司机

1. 买可乐(50%)

我没不清楚另50%为什么通不过,求指点

//游游今年就要毕业了,和同学们在携程上定制了日本毕业旅行。愉快的一天行程结束后大家回到了酒店房间,这时候同学们都很口渴,石头剪刀布选出游游去楼下的自动贩卖机给大家买可乐。
//
//贩卖机只支持硬币支付,且收退都只支持10 ,50,100 三种面额。一次购买行为只能出一瓶可乐,且每次购买后总是找零最小枚数的硬币。(例如投入100圆,可乐30圆,则找零50圆一枚,10圆两枚)
//
//游游需要购买的可乐数量是 m,其中手头拥有的 10,50,100 面额硬币的枚数分别是 a,b,c,可乐的价格是x(x是10的倍数)。
//
//如果游游优先使用大面额购买且钱是够的情况下,请计算出需要投入硬币次数?
//
//
//
//输入描述
//依次输入,
//
//需要可乐的数量为 m
//
//10元的张数为 a
//
//50元的张数为 b
//
//100元的张树为 c
//
//1瓶可乐的价格为 x
//
//输出描述
//输出当前金额下需要投入硬币的次数
//
//例如需要购买2瓶可乐,每瓶可乐250圆,手里有100圆3枚,50圆4枚,10圆1枚。
//
//购买第1瓶投递100圆3枚,找50圆
//
//购买第2瓶投递50圆5枚
//
//所以是总共需要操作8次金额投递操作
//
//
//样例输入
//2
//1
//4
//3
//250
//样例输出
//8
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Main {


/*请完成下面这个函数,实现题目要求的功能
当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^ 
******************************开始写代码******************************/
    static int buyCoke(int m, int a, int b, int c, int x) {
        int ans = 0;
        int[] haves = {c, b, a};
        int[] faces = {100, 50, 10};
		for(int i = 0; i < m; i++){
            int count = 0;
            int money = x;
            for(int j = 0; j < 3; j++){
                int temp = money / faces[j] + (money % faces[j] == 0 ? 0 : 1);
                if(temp <= haves[j]){
                    haves[j] -= temp;
                    count += temp;
                    // 找钱
                    int back = money % faces[j];
                    int k = j;
                    while(k + 1 <= 2){
                    	haves[k + 1] += back / faces[k + 1];
                        back = back % faces[k + 1];
                        k++;
                    }
                    break;
                }else{
                    count += haves[j];
                    money -= haves[j] * faces[j];
                    haves[j] = 0;
                }
            }
            ans += count;
        }
		return ans;
    }
/******************************结束写代码******************************/


    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int res;
            
        int _m;
        _m = Integer.parseInt(in.nextLine().trim());
        
        int _a;
        _a = Integer.parseInt(in.nextLine().trim());
        
        int _b;
        _b = Integer.parseInt(in.nextLine().trim());
        
        int _c;
        _c = Integer.parseInt(in.nextLine().trim());
        
        int _x;
        _x = Integer.parseInt(in.nextLine().trim());
  
        res = buyCoke(_m, _a, _b, _c, _x);
        System.out.println(String.valueOf(res));    

    }
}


2. 派司机

package top.actim.test09;

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

/**
 * 	司机派遣到AB区域会得到不同的报酬
 * 	要求派遣到AB区域的司机人数相等(司机为2N个)
 *	使报酬最多
 *
 *	每行一个司机,AB的报酬
 *	
 *	输入:
 *	10 30
 *	100 200
 *	150 50
 *	60 20
 *	#
 *
 *	输出:
 *	440
 */
public class Main {

	static class Driver {
		static int nA; // A更大的结点数
		static int nB; // B更大的结点数
		static int ans; // 最终结果,由balance得出
		int A;
		int B;
		int max;
		int down; // |A - B|

		static ArrayList<Driver> data = new ArrayList<Driver>();

		Driver(int a, int b) {
			A = a;
			B = b;

			if (A > B) {
				down = A - B;
				max = A;
				nA++;
			} else {
				down = B - A;
				max = B;
				nB++;
			}

			ans += max; // 不限制选择AB数量时的最优值

			data.add(this);
		}

		// 平衡nA和nB并得出结果
		static void balance() {
			// 排序,其实用堆更好吧
			data.sort(new Comparator<Driver>() {
				@Override
				public int compare(Driver o1, Driver o2) {
					return o1.down - o2.down;
				}
			});
			// 需要进行改派的次数
			int div = nA - nB;
			div /= 2;
			for (int i = 0; i < data.size(); i++) {
				// 如果nA比nB多
				if (div > 0) {
					// 如果当前结点是A比较大
					if (data.get(i).max == data.get(i).A) {
						// 改派
						ans -= data.get(i).down;
						nA--;
						nB++;
						div++;
					}
				} else if (div < 0) {
					if (data.get(i).max == data.get(i).B) {
						ans -= data.get(i).down;
						nA++;
						nB--;
						div--;
					}
				} else {
					break;
				}
			}
		}
	}

	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);

		while (cin.hasNextInt()) {
			int incomeOfA = cin.nextInt();
			int incomeOfB = cin.nextInt();

			// Start coding -- Input Data
			new Driver(incomeOfA, incomeOfB);
		}

		// Start coding
		Driver.balance();
		System.out.println(Driver.ans);
	}

}

//10 30 100 200 150 50 60 20#
//
//440
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值