入门-贪心算法

1. 看电视

题目描述

暑假到了,小明终于可以开心的看电视了。但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目。
现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗?

输入

输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数。
接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。
当n=0时,输入结束。

输出

对于每组输入,输出能完整看到的电视节目的个数。

样例输入

12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0

样例输出

5

解析

区间问题,像覆盖尽量多的区间,则按区间右端点排序。

题目链接 看电视

代码

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

typedef struct TVShow{
	int s, e;
}TV;

bool cmp(TV tv1, TV tv2){
	if (tv1.e == tv2.e) return tv1.s < tv2.s;
	return tv1.e < tv2.e;
}

TV tv[105];
int main(){
	int n;
	while(scanf("%d", &n) && n != 0){
		for (int i=0; i<n; ++i){
			cin>>tv[i].s>>tv[i].e;
		}
		sort(tv, tv+n, cmp);
		int cnt = 0, pre = 0;
		for (int i=0; i<n; i++){
			if (tv[i].s >= pre){
				++cnt;
				pre = tv[i].e;
			}
		}
		cout<<cnt<<endl;
	}
	return 0;
}

2. 出租车费

题目描述

某市出租车计价规则如下:起步4公里10元,即使你的行程没超过4公里;接下来的4公里,每公里2元;之后每公里2.4元。行程的最后一段即使不到1公里,也当作1公里计费。
一个乘客可以根据行程公里数合理安排坐车方式来使自己的打车费最小。
例如,整个行程为16公里,乘客应该将行程分成长度相同的两部分,每部分花费18元,总共花费36元。如果坐出租车一次走完全程要花费37.2元。
现在给你整个行程的公里数,请你计算坐出租车的最小花费。

输入

输入包含多组测试数据。每组输入一个正整数n(n<10000000),表示整个行程的公里数。
当n=0时,输入结束。

输出

对于每组输入,输出最小花费。如果需要的话,保留一位小数。

样例输入

3
9
16
0

样例输出

10
20.4
36

题目链接 出租车费

代码

#include <iostream>
#include <cstdio>
using namespace std; 
const int nmax=10000000+10;
const double eps=1e-6;
 
int main() {
	int n;
	while(1){
		cin>>n;
		if(n==0){
			break;
		}
		double sum=0;
		if(n<=4){
			sum=10;
		}else if(n>=4 && n<=8){
			sum=10+(n-4)*2;
		}else if(n>=8){
			sum += 18 * (n/8);
			n = n % 8;
			if(n<=4){
				sum+=2.4*n;
			}
			else{
				sum+=10+(n-4)*2;
			}
		}
		int tmp=(int)sum;
		if(sum-tmp<eps) printf("%d\n",tmp);
		else printf("%.1lf\n",sum);
	}
	return 0;
}

3. 迷障

题目描述

小明正在玩游戏,他控制的角色正
面临着幽谷的考验——
幽谷周围瘴气弥漫,静的可怕,隐约可见地上堆满了骷髅。由于此处长年不见天日,导致空气中布满了毒素,一旦吸入体内,便会全身溃烂而死。
幸好小明早有防备,提前备好了解药材料(各种浓度的万能药水)。现在只需按照配置成不同比例的浓度。
现已知小明随身携带有n种浓度的万能药水,体积V都相同,浓度则分别为Pi%。并且知道,针对当时幽谷的瘴气情况,只需选择部分或者全部的万能药水,然后配置出浓度不大于 W%的药水即可解毒。
现在的问题是:如何配置此药,能得到最大体积的当前可用的解药呢?
特别说明:由于幽谷内设备的限制,只允许把一种已有的药全部混入另一种之中(即:不能出现对一种药只取它的一部分这样的操作)。

输入

输入数据的第一行是一个整数C,表示测试数据的组数;
每组测试数据包含2行,首先一行给出三个正整数n,V,W(1<=n,V,W<=100);
接着一行是n个整数,表示n种药水的浓度Pi%(1<=Pi<=100)。

输出

对于每组测试数据,请输出一个整数和一个浮点数;
其中整数表示解药的最大体积,浮点数表示解药的浓度(四舍五入保留2位小数);
如果不能配出满足要求的的解药,则请输出0 0.00。

样例输入

2
1 35 68
1
2 79 25
59 63

样例输出

35 0.01
0 0.00

题目链接 迷障

解析

排序,先加浓度低的,直到浓度超过w

代码

#include <cstdio> 
#include <iostream>
#include <algorithm>

using namespace std;

int main(){
	int C;
	cin>>C;
	while(C--){
		int n, v;
		int w, M[105];
		cin>>n>>v>>w;
		for (int k=0; k<n; ++k){
			cin>>M[k];
		}
		sort(M, M+n);
		int total = 0;
		double p = 0;
		int k;
		for (k=0; k<n; ++k){
			if ((total+M[k]) / (double)(k+1) > (double)w){
				break;
			}
			total += M[k];
			p = total / (double)(k+1);
		}
		printf("%d %.2f\n", k*v, p/100.0);
	}
	return 0;
}

4. 均分纸牌

题目描述

有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。
  移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
  现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
  例如 N=4,4 堆纸牌数分别为:
  ① 9 ② 8 ③ 17 ④ 6
  移动3次可达到目的:
  从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。

输入

键盘输入文件名。文件格式:
  N(N 堆纸牌,1 <= N <= 100)
  A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)

输出

输出至屏幕。格式为:
  所有堆均达到相等时的最少移动次数。‘

样例输入

4
9 8 17 6

样例输出

3

题目链接 均分纸牌

代码

#include<iostream>
using namespace std;
int main()
{
    int a[100],N,i,s=0,c=0;
    cin>>N;
    for(i=0;i<N;i++) 
    {
        cin>>a[i];
        s=s+a[i];
    }
    int ave=s/N;
    for(i=0;i<N;i++)
        a[i]=a[i]-ave;
    for(i=0;i<N;i++)
    {
        if(a[i]==0) continue;
        else
        {   
            a[i+1]=a[i+1]+a[i];
            c++;
        }
    }
    cout<<c;
}

5. 糖果峡谷

题目描述

吃到到前面的糖果以后,小Y充满了能量,继续向前走,眼睛痴痴的望着那遥远的糖果雨。
走啊,走啊,走啊走~~~
小Y又累了,不过它的精神已经打动了糖人。
一阵风飘过,糖人又出现在小Y的面前。小Y顿时两眼放光,想从糖人那里骗到一些糖果,来堵住口水,顺便补充能量。糖人微微一笑,说道:“别妄想了,我这个世界同在,如果你打我的注意,你将永远也到不了那有糖果雨的地方!”为了更多的糖果,小Y立刻冷静下来,装出一副“我才不会打你的注意”的样子。
糖人见小Y已经平静下来。于是,一挥手,眼前景象大变。小Y揉了揉眼睛,有些不敢相信自己的眼睛,不过,这确实是真的!!
小Y现在在一个峡谷里[一线天]前,峡谷有N个糖果单位,时刻都在向下飘落着糖果,不过由于没有人来,糖果到地面就会消失,小Y一阵心痛。
糖人从手中拿出一个巨大的容器交个小Y,并告诉他,在糖果峡谷中神秘力量的推动下,他每分钟前进1个糖果单位。糖人给小Y的容器有C个格子,每个格子只可以装1个糖果。
糖果峡谷里一共有K种糖果,每种糖果有Mi个,第i种会在峡谷中离入口Si(0<Si<=N)个糖果单位出现,可以选择用容器接或不接,接住的数量是任意的,当然不能超过Mi个;如果接住以后,会在Ti分钟(Ti>0,Si+Ti<N)后真正属于小Y [接住时那一分钟也计算在内,即在走到Si+Ti-1个单位后,糖果会属于小Y],糖果属于小Y以后就不会再占用容器的空间了。
小Y此时已经被糖果冲昏了头脑,只想得到最多的糖果。所以,他向你求助,你要想办法,让小Y接住最多的糖果。

输入

第一行,三个整数K,N,C
接下来K行,每行三个数,Si,Ti,Mi

输出

输出仅一行,最大的糖果数

样例输入

4 16 3
1 3 2
2 7 3
4 4 1
9 6 2

样例输出

6

题目链接 糖果峡谷

代码

没通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值