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