C/C++每日小练(五)——袭击战

袭击战

你有n个部下,每一个部下须要完毕一项任务。第i个部下须要你花Bi分钟交代任务,然后他会独立地、无间断地运行Ji分钟后完毕任务。

你须要选择交代任务的顺序。使得全部任务尽早运行完毕(即最后一个运行完的任务应尽早结束)。注意。不能同一时候给两个部下交代任务。但部下们能够同一时候运行他们各自的任务。

输入格式:

输入包括多组数据,每组数据的第一行为部下的个数N(1<=n<=1000);下面N行每行两个正整数B和J(1<=B<=10000,1<=J<=10000),即交代任务的时间和运行任务的时间。输入结束表示为N=0。

输出格式:

对于每组数据,输出全部任务完毕的最短时间。

例子输入:

3

2 5

3 2

2 1

3

3 3

4 4

5 5

0

例子输出:

Case 1: 8

Case 2: 15

解:这是一个简单地贪心算法的应用——运行时间较长的任务先交代(选择两个任务运行时。顺序不同而导致总时间不同,在讨论选择两个任务哪个先运行的问题上,能够看出,因为两个任务交代的时间B是固定的,所以只比較两个任务的运行时间J就可以),所以要依照J从小到大的顺序给各个任务排序,然后依次交代~

Code:

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

struct Job {
	int j, b;
	bool operator < (const Job& x) const {		//运算符重载,要加上const~~
		return j > x.j;
	}
};

int main() {
	int n, b, j, count = 1;
	while(scanf("%d", &n)==1 && n) {
		vector<Job> v;
		for(int i = 0; i < n; i++) {
			scanf("%d%d", &b, &j);
			v.push_back((Job){j, b});
		}
		sort(v.begin(), v.end());										//使用Job类自己的<运算符排序
		int s = 0;
		int ans = 0;
		for(int i = 0; i < n; i++) {
			s += v[i].b;
			ans = max(ans, s+v[i].j);
		}
		printf("Case %d: %d\n", count++, ans);
	}
	return 0;
}

执行结果:

时间: 2024-10-20 17:57:17

C/C++每日小练(五)——袭击战的相关文章

C语言每日小练(四)——勇者斗恶龙

勇者斗恶龙 你的王国里有一条n个头的恶龙,你希望雇佣一些骑士把它杀死(砍掉全部的头). 村里有m个骑士能够雇佣.一个能力值为x的骑士能够砍掉恶龙一个致敬不超过x的头,且须要支付x个金币. 怎样雇佣骑士才干砍掉恶龙的全部头.且须要支付的金币最少?注意,一个骑士仅仅能砍一个头(且不能被雇佣两次). 输入格式:输入包括多组数据. 每组数据的第一行为正整数n和m(1<=n,m<=20000):下面n行每行为一个整数.即恶龙每一个头的直径.下面m行每行为一个整数,即每一个骑士的能力. 输入结束标志为n=

【iOS开发每日小笔记(五)】实测copy到底是个神马玩意

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

每日一小练——按字典顺序列出所有排列

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出所有排列 内容:请写一个程序,用字典顺序列出n个元素的所有排列 这个问题有点小复杂,不是太好想,反正我是想了好久. 看到这个题目我先是想到的就是递归因为这个题目就是用指针对高位选择,然后将指针传给临近的低位再选择. 不过仔细研究原来没这么简单.以n=4举例当处理以1开头的排列时1234到1432,但是在排列2开头的时候不太好建立统一的递归关系.(没办法太统一的递归方法中将后面的数字选出来),所以将第一位分

3.12课程小练以及vim编辑器的基本用法(部分)

 课程小练 1. 通过man帮助手册,自行总结which.whereis.whatis命令的使用方法: which:展示出shell命令的完整路径: 格式: which [options] [--] programname [...] whereis:基于二进制的,有源的,和文件或命令的记录手册 格式:whereis [options] name... whatis:在 whatis 数据库里查找完整的单词 格式:whatis - 2. du命令: du - 报告磁盘空间使用情况 du -a,

每日一小练——按字典顺序列出全部排列

上得厅堂,下得厨房,写得代码,翻得围墙.欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出全部排列 内容:请写一个程序,用字典顺序列出n个元素的全部排列 这个问题有点小复杂,不是太好想.反正我是想了好久. 看到这个题目我先是想到的就是递归由于这个题目就是用指针对高位选择,然后将指针传给临近的低位再选择. 只是细致研究原来没这么简单. 以n=4举例当处理以1开头的排列时1234到1432,可是在排列2开头的时候不太好建立统一的递归关系. (没办法太统一的递归方法中将后面的数字选出来),所以将第一

我的小目标,兄弟连战狼班Java培训是我成长的必经之路

哈喽哈喽·各位老师同学们,大家好.我是一名兄弟连战狼班的莘莘学子,刚刚步入学校没多久.也就七八九...十来天吧. 说起我的小目标,兄弟连战狼班Java培训是我成长的必经之路 很高兴大家能相聚在这里,都是缘分朋友们.来兄弟连些日子里,我很开心,仿佛又找到了之前大学时的气氛,很是热闹,但是这又与大学不太一样.因为这里几乎一个星期讲了大学一个月的内容. 在兄弟连战狼班(www.itzhanlang.com)每天都过得特别充实,可能是多年前就离开了学校,这一次又步入这里.我也觉得学习很吃力. 同时呢,每

CSS3每日一练之内容处理-嵌套编号

出处:http://www.w3cfuns.com/thread-5592229-1-17.html 1.大标题一   1.子标题   2.子标题   3.子标题2.大标题二   1.子标题   2.子标题3.大标题三   1.子标题   2.子标题   3.子标题 这种问题,你可能会觉得直接定义两个计数器,分别编号不就行了,于是就写出了如下代码: <!DOCTYPE HTML> <html> <head> <meta charset="gb2312&q

java每日小算法(27)

/* [程序27]  题目:求100之内的素数    */ package test; import java.util.Scanner; public class test { public static boolean prime(int number) { boolean flag = true; int mid = (int)Math.sqrt(number); for(int i = 2; i< mid+1; i++) { if(number % i == 0) { flag = fa

java每日小算法(4)

[程序4] 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步. package test; import java.util.ArrayList;