蓝桥杯省赛夺奖冲刺营贪心算法

蓝桥杯省赛夺奖冲刺营贪心算法

「找零问题」

题目描述
蓝桥商店的老板需要找零 n 元钱。

钱币的面额有:100 元、50 元、20 元、5 元、1 元,问如何找零使得所需钱币的数量最少?

注意:n 可能为 0,也能为几百元(别问,问就是来着里微信提现来了)

输入描述
在第一行给出测试例个数 N,代表需要找零的钱数。

1≤N≤105

输出描述
输出共有 5 行,每一行输出数据输出找零的金额与数量,详情看样例。

示例
输入

365

输出

100:3
50:1
20:0
5:3
1:0

运行限制
最大运行时间:1s
最大运行内存: 128M

代码

import java.util.Scanner;

public class Main {
	static int[] m= {100,50,20,5,1};
	static int n;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n=sc.nextInt();//钱
		for (int i = 0; i < m.length; i++) {
			System.out.println(m[i]+":"+n/m[i]);
			n-=n/m[i]*m[i];
		}
	}
}

「小 B 的宿舍」

题目描述

小B的宿舍楼沿着走廊南北向的两边各有200 个房间,如下所示:

[房间1][房间3][房间5][房间7][房间9 ]...[房间399]
----------------------------------------------
                   走廊
----------------------------------------------
[房间2][房间4][房间6][房间8][房间10]...[房间400]

最近,由于转专业和专业分流的原因,宿舍将迎来新的调整,以便组成新的班级后方便管理。

但是由于走廊狭窄,走廊里只能通过两个搬运的物品(可以同向也可以反向),因此必须指定高效的搬运计划。

老师给了每位同学下达了以下要求,让同学们体现收拾好行李,然后给每位同学 1 分钟的时间搬运。

当从房间 i 搬运行李到 j 时,i 与 j 之间的走廊都会被占用,但是可以容纳两个不同同学同时搬运。所以,10 分钟之内同一段走廊最多两个人同时搬运,不重叠的走廊也可以同时搬运。

小B的老师是个数学老师,经过运筹学一通计算他得到了最优的搬运计划。

虽然计划不唯一,但是最优值唯一,请问这个最短时间是多少?

输入描述
输入数据有 T 组测试例,在第一行给出测试例个数 T。

每个测试例的第一行是一个整数 N(1≤N≤200),表示要搬运行李的人数。

接下来 N 行,每行两个正整数 s 和 t,表示一个人,要将行李是从房间 s 移到到房间t。

输出描述
每组输入都有一行输出数据,为一整数 Time,表示完成任务所花费的最小时间。

示例
输入

3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50

输出

10
10
20

运行限制
最大运行时间:1s
最大运行内存: 128M

代码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static int[] m=new int[201];
	static int T;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		T=sc.nextInt();//测试数
		int n,l,r,max=0;
		while(T-->0) {
			n=sc.nextInt();//人数
			while(n-->0) {
				l=sc.nextInt();
				r=sc.nextInt();
				for (int i = l; i <= r; i++) {
					m[i]+=1;
				}				
			}
			max=0;
			for (int i = 1; i <= 200; i++) {
				if(m[i]>max)max=m[i];
			}
			System.out.println((max+1)/2*10);
			Arrays.fill(m, 0);
		}
	}
}

「贪心的自助餐」

题目描述

小B同学想去吃自助餐,但是他是那种比较节俭的的人,既不想浪费食物,又想尽可能吃的贵一点,他于是私下里做了调查。

小蓝餐厅的自助餐有 n 种食材,每种食材都有它的价格。

而且也能估计出每一份的重量,所以他列了一个表格:

菜品 价格(元) 重量(g)
红烧牛肉 30 300
油闷大虾 8 5
四喜丸子 4 8
三文鱼 5 3
排骨 18 200
麻辣兔头 20 120
高汤海参 40 70
扇贝粉丝 8 32
牛排 79 240
小B的饭量为 C(g),他想知道在不超过饭量的情况下他最多能吃多少钱的菜品。

请你设计一个程序帮助小B计算他的最多吃了多少钱。(假设自助餐厅的菜品供应同样的菜品每个人只能取一份。)

输入描述
第一行输入两个整数 n,C(0≤n≤103 ,0≤C≤104),其中 n 为菜品数量,C 为小B的肚子容量。

接下来 n 行每行输入两个数 v[i],w[i],v[i] 是第 i 个菜品的价值,w[i] 表示第 i 个菜品的重量(0≤v[i],w[i]≤104)。

输出描述
输出一行数据,表示最大的价值,保留小数点后三位数。

示例
输入

20 1000
1 22
2 43
123 214
12 2
123 432
21 223
22 16
77 49
34 78
34 9
43 677
21 34
23 23
12 56
332 56
21 99
123 545
389 33
12 999
23 88

输出

1204.114

运行限制
最大运行时间:1s
最大运行内存: 128M

代码

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
	static Food[] m;
	static int n;
	static double c;
	static class Food{
		double v;
		double w;
		double avg;
		public Food(double v,double w) {
			this.v=v;
			this.w=w;
		}
	}
	static class MyComp implements Comparator<Food>{
		@Override
		public int compare(Food o1, Food o2) {
			if(o1.avg<o2.avg)return 1;
			return -1;
		}
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n=sc.nextInt();//菜品数
		c=sc.nextDouble();//肚子容量
		m=new Food[n];
		double vv=0;
		double ww=0;//价值,重量
		int cnt=0;
		for (int i = 0; i < n; i++) {
			vv=sc.nextDouble();
			ww=sc.nextDouble();
			m[i] = new Food(vv, ww);
			m[i].avg=vv/ww;
			cnt+=ww;
		}
		Comparator comp = new MyComp();//排序的迭代器
		Arrays.sort(m,comp);//排序
		double sum=0;
		double t;
		if(cnt<c) {//这里一定要注意,如果饭量大,可以把所有食物吃完,用下面的方法就会不准确,因为有四舍五入的情况
			for (int i = 0; i < n; i++) {
				sum+=m[i].v;
				System.out.println(String.format("%.3f", sum));
			}
		}else {
			for (int i = 0; i < n; i++) {
				if(c<=0)break;
				t=(int) Math.min(c, m[i].w);
				sum+=t*m[i].avg;
				c-=t;
			}
			System.out.println(String.format("%.3f", sum));
			
		}
	}
}

你可能感兴趣的:(13届蓝桥杯夺奖冲刺营,蓝桥杯,算法,java)