蓝桥杯|贪心算法的实际应用(先整理题目,具体代码稍后)

1.盾神与积木游戏

问题描述

最近的m天盾神都去幼儿园陪小朋友们玩去了~
  每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西。但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他小朋友的积木才能完成他的大作。如果某个小朋友完成了他的作品,那么他就会把自己的作品推倒,而无私地把他的所有积木都奉献出来;但是,如果他还没有完成自己的作品,他是不会把积木让出去的哟~
  盾神看到这么和谐的小朋友们感到非常开心,于是想帮助他们所有人都完成他们各自的作品。盾神现在在想,这个理想有没有可能实现呢?于是把这个问题交给了他最信赖的你。
输入格式
  第一行为一个数m。
  接下来有m组数据。每一组的第一行为n,表示这天有n个小朋友。接下来的n行每行两个数,分别表示他现在拥有的积木数和他一共需要的积木数。
输出格式
  输出m行,如果第i天能顺利完成所有作品,输出YES,否则输出NO。

样例输入

2
2
2 2
1 3
3
1 5
3 3
0 4

样例输出

YES
NO

数据规模和约定

1<=n<=10000,1<=m<=10。

我的思路

贪心算法和结构体

准备知识

贪心算法首先要将数据进行排序。
老师上课说要用sort函数,我自然一头雾水,现在查了一番。大概懂了。

对sort函数的理解:
  • 首先是它的来源,被包括在头文件#include的c++标准库中。
  • 二者,是它的结构,有三个参数:第一个是要排序的数组的起始地址,第二个是结束的地址,第三个是排序的方法(如果不写的话就默认从小到大排)
  • 比较重要的是从大到小的排序方法,代码如下:
//要想实现从大到小排序,需要加入一个比较函数complare()
bool complare(int a,int b)
{
return a>b;
}

ok,下面可以做出来了

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1E4+10;
struct node
{
	int have,need,dif;
}a[maxn];
 
bool complare(node a,node b)
{
	return a.dif<b.dif;
}
 
bool func(int n)
{	
	int sum=0;
	sort(a,a+n,complare);
	for(int i=0;i<n;i++)
	{
		if(a[i].dif<=sum) sum+=a[i].have;
		else return false;
	}
	return true;
}
int main()
{
	int m,n; 
	cin>>m;
	while(m--){
		cin>>n;
		for(int i=0;i<n;i++)
		{
			cin>>a[i].have>>a[i].need;
			a[i].dif=a[i].need-a[i].have;
		}
		if(func(n))   cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}	
	return 0;
}

2.线段和点

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

有n个点和m个区间,点和区间的端点全部是整数,对于点a和区间[b,c],若a>=b且a<=c,称点a满足区间[b,c]。
  求最小的点的子集,使得所有区间都被满足。

输入格式

第一行两个整数n m
  以下n行 每行一个整数,代表点的坐标
  以下m行 每行两个整数,代表区间的范围

输出格式

输出一行,最少的满足所有区间的点数,如无解输出-1。

样例输入

5 5
2
6
3
8
7
2 5
3 4
3 3
2 7
6 9

样例输出

2

数据规模和约定

1<=n,m<=10000
  0<=点和区间的坐标<=50000

我的思路

题目要求找到最少的点子集在全部区间内,是并运算。
先贴下别人的答案把

3.A careful approach

问题描述

如果你认为参加一个编程比赛让你感到有压力,那么请你想象你是一个空中交通管制员。因为人命关天,所以一个空中交通管制员必须在时刻变化的环境中专注于任务,解决不可预知的事件。
  让我们将目光转向飞机的着陆流程。飞机进入目的地飞航情报区之后,就会报告自己的位置、方向和速度,然后管制员就需要制定计划让所有飞机按指令安全着陆。一般来说,连续的两次着陆之间间隔时间越长,就越安全。因为这些额外的时间能够让工程师有机会对天气变化以及其他突发事件作出反应。
  幸运的是,有一部分计划的制定可以自动化——这就是你来这里的原因。你会得到有关飞机着陆的脚本。每一个飞机都有一个安全着陆时间窗。你算出的指令必须要符合每个飞机的时间窗。另外,飞机的着陆时间点要尽量均匀,使得连续两次着陆的最小间隔尽量大。例如,如果三架飞机分别着陆于10:00am、10:05am、10:15am,那么最小间隔是五分钟,在头两架飞机之间。所有间隔不一定一样,但是最小的间隔要尽量大。
输入格式
  多组数据。每个数据第一行为一个整数n,为飞机架数。接下来n行,每行两个整数a[i],b[i]表示这架飞机只能在闭区间[a[i],b[i]]间降落。a[i]和b[i]的单位是分钟。输入的最后一行是一个零。
输出格式
  对于每组数据,先输出第几组,然后输出最小间隔,单位为分和秒,舍入到最近的整数。格式参见样例。

样例输入

3
0 10
5 15
10 15
2
0 10
10 20
0

样例输出

Case 1: 7:30
Case 2: 20:00

数据规模和约定

20% n<=5
  100% 2<=n<=8, 0<=a[i], b[i]<=1440, 数据组数不大于20.

涉及知识

全排列
二分算法

代码

(全排列还不知道是什么呢,不会写,先空着把)

4.Sheep

问题描述

信息技术的发展日益渗透到人类活动的各个领域。令人难以置信的是,最先进的科技被用到了农业上。
  在一个大农场有一片草地和成群的羊。这里总共有 n 只羊,它们中的每一个被标上了一个独一无二的编号,编号的范围从 1 到 n ——因为你需要区分出每只羊并记住它们的信息,而且它们还如此的相似!这片草地有无限数量的区域,从 1 到无穷编号。已知 i 号羊喜欢编号从 li 到 ri 的区域。
  这里有两个牧羊人在照顾羊群:甲和乙。甲每天早晨起得很早,领着羊群到草地上去吃草。乙则在晚上出来领回所有的羊。
  一天早晨,甲起得比平时有点迟,没有时间领羊群到草地上吃草。因此,他把所有有公共喜欢区域的羊拴在一起。甲认为这样会更好——乙晚上时会少做些工作,因为羊不会走开太远,它们正被互相拴着呢!
  到了夜晚,乙来到了草地,他把羊群聚集起来并尝试把它们排成一队。但是尽管他很努力了,羊群还是没有排成他想要的那样。乙没有力气和能力去解开羊群,只好让它们保持原样,但有一个条件:他想要把羊群排成一队,使得相互栓着的羊的最大距离尽可能小。两只羊的距离定义为它们在队列中排名的差值。

输入格式

第一行包含一个整数 n。接下来的 n 行每行包含两个整数 li 和 ri。

输出格式

输出共一行,n 个用空格隔开的数字——要求的羊群的排列。这一行的第 i 个值必须代表最优排列从左数第 i 只羊的编号。
  如果有多种最优解,输出任意一种即可。

样例输入

3
1 3
5 7
2 4

样例输出

1 3 2

样例输入

5
1 5
2 4
3 6
1 7
2 6

样例输出

2 1 3 5 4

样例输入

4
1 3
4 6
5 7
2 3

样例输出

1 4 2 3

数据规模和约定

对于20%的数据,1 ≤ n ≤ 8;
  对于60%的数据,1 ≤ n ≤ 200;
  对于100%的数据,1 ≤ n ≤ 2000,1 ≤ li ≤ ri ≤ 109。

5.Candy store

问题描述

经营一家糖果店是非常困难的,你需要优化各种各样的东西。最近你在销售一种非常时髦的糖果,叫做Whizboppers。这种糖果变质非常迅速,所以:
  ·你必须每天早上从供应商买来新的Whizboppers。
  ·你必须用当天早上从供应商买来的盒子装着糖果出售。

你可以从你的供应商处买来装有任意整数克糖果的盒子。
  每天有至多k位顾客到你的店里来。从第1个人开始,每个人会选择花费整数分的钱来买Whizboppers,钱数在1分到C分之间(包含1分和C分)。你打算以1分钱每克的价格出售;所以如果一个人想要花4分钱,你会给他恰好4克糖果。你可以给他1个4克的盒子,也可能是1个2克的盒子和2个1克的盒子。
  你最少需要买几个盒子才能保证,不管每个人想花多少钱买糖,你总是可以给他们对应质量的糖果?

注意:当一个人选择自己想买多少糖果后,你知道之前的人已经买了多少糖,但不能预知之后的人打算买多少糖。
  举个例子,如果每天至多有2位顾客到你的店里,每个人至多花2分钱(k=2,C=2),你可以从你的供应商买4个1克的盒子。但是你可以做的更好:只要买2个1克的盒子和1个2克的盒子,就可以满足你的顾客。如下所示:

第一个人 给第一个人的盒子 第二个人 给第二个人的盒子
2分 1 个 2克 2分
1分
2 个 1克
1 个 1克
1分 1 个 1克 2分
1分
1 个 2克
1 个 1克

不论第一个人怎么买,你都可以给他对应质量的盒子,同时保证第二个人也能拿到正确质量的糖果。所以对于k=2,C=2,你用3个盒子就可以满足任意的顾客需求。
输入格式
  第一行一个整数T,表示询问数量。
  接下来T行,每行包含两个整数k和C,分别表示最大人数和每个人花费的最多钱数。
输出格式
  对于每一个询问,输出一行包含"Case #x: y",x是询问编号(从1开始标号),y是你每天最少需要的盒子数量。

样例输入

4
1 5
2 2
10 3
2 50

样例输出

Case #1: 3
Case #2: 3
Case #3: 19
Case #4: 11

数据规模和约定

对于25%的数据,k<=20,C<=3;
  对于另外20%的数据, k<=1000,C<=10;
  对于另外5%的数据,k=1;
  对于100%的数据,1 <= T <= 100,1 <= k <= 1000,1 <= C <= 10^12。

6.翻硬币

问题描述

小明正在玩一个“翻硬币”的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:oo*oooo

如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:

输入格式

两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000

输出格式

一个整数,表示最小操作步数。

样例输入1


oo

样例输出1

5

样例输入2

ooo***
ooo***

样例输出2

1

7.矩阵翻转

问题描述
Ciel有一个N*N的矩阵,每个格子里都有一个整数。

N是一个奇数,设X = (N+1)/2。Ciel每次都可以做这样的一次操作:他从矩阵选出一个X*X的子矩阵,并将这个子矩阵中的所有整数都乘以-1。

现在问你经过一些操作之后,矩阵中所有数的和最大可以为多少。

输入格式
第一行为一个正整数N。

接下来N行每行有N个整数,表示初始矩阵中的数字。每个数的绝对值不超过1000。

输出格式
输出一个整数,表示操作后矩阵中所有数之和的最大值。
样例输入
3
-1 -1 1
-1 1 -1
1 -1 -1
样例输出
9
数据规模与约定
1 <= N <= 33,且N为奇数。

8.排队打水

问题描述
  有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2…………tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入格式
  第一行n,r (n<=500,r<=75)
  第二行为n个人打水所用的时间Ti (Ti<=100);
输出格式
  最少的花费时间
样例输入
3 2
1 2 3
样例输出
7

数据规模和约定
  其中80%的数据保证n<=10

9.快乐司机

问题描述
  “嘟嘟嘟嘟嘟嘟
  喇叭响
  我是汽车小司机
  我是小司机
  我为祖国运输忙
  运输忙”
  这是儿歌“快乐的小司机”。话说现在当司机光有红心不行,还要多拉快跑。多拉不是超载,是要让所载货物价值最大,特别是在当前油价日新月异的时候。司机所拉货物为散货,如大米、面粉、沙石、泥土…
  现在知道了汽车核载重量为w,可供选择的物品的数量n。每个物品的重量为gi,价值为pi。求汽车可装载的最大价值。(n<10000,w<10000,0<gi<=100,0<=pi<=100)
输入格式
  输入第一行为由空格分开的两个整数n w
  第二行到第n+1行,每行有两个整数,由空格分开,分别表示gi和pi
输出格式
  最大价值(保留一位小数)

样例输入

5 36
99 87
68 36
79 43
75 94
7 35

样例输出

71.3
解释:
先装第5号物品,得价值35,占用重量7
再装第4号物品,得价值36.346,占用重量29
最后保留一位小数,得71.3

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值