经典贪心算法uva11729
uva11729
这个题的题意是
你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交代任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。
你需要选择交待任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务应尽早结束)。注意,不能同时给两个部下交待任务,
但部下们可以同时执行他们各自的任务
求完成所有任务的最短时间
实际上呢我们知道这是一个排序的问题。。当然有时候可以转化成其他问题。。
我们先按它是一个排序的问题来搞一下。。
那么每个元素就有两个属性交待的时间a,完成任务的时间b,显然这是一个二维偏序的问题(?)
那么我们考虑第一维有三种情况(等于,大于,小于),第二维也有三种情况。。
由组合数学的乘法原理得。。最后的结果总数是3*3=9
那么我们枚举小数据来看看相邻两个元素怎么放置可以使结果最小,如果这个确定的话那么我们可以冒泡排序
通过交换来维持这个性质,当然这个是要有前提的,那就是要满足最优子结构的性质,也就是说这个问题呢
要满足如果我序列里任何相邻元素都满足上面使结果最小的顺序导致我总体结果也是最小的那么这样的话,
应该是满足最优子结构的性质的,那么我们分析这个问题。。很显然你把它两两相邻考虑
从一个元素开始慢慢往上加。。每加入一个元素我们就调整顺序。。那么这样我们就保证了使每次取max(pre-element,cur-element)
我们每次使这个将要考虑的cur-element最小,那么我们最后取得最大值就会最小。。
那么如果我们用探索法画图画这九种情况来分析规律
我们画了5种。。但是足以看出来。。我们先做执行任务长的,时间会更短
那么我们其实还发现不管什么顺序。。安排任务的时间总和是固定的。。但是结果不同
区别就在于分配任务的前缀和加上哪个执行任务时间对答案的贡献。。那么我们显然可以得到。。执行任务时间最长的应该配
一个较短的分配任务前缀和。。这样可以减小这个最大值对答案的贡献
还有一些地方不太懂。。再做几道类似的题目再说吧
UVA的64位整数是%lld 另外要注意答案输出格式。。不要以为数值对了就能AC。。
贴上AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll;
const int maxn=1e3+;
int N;
struct node{
int a,b;
}Node[maxn];
bool cmp(node a,node b){
if(a.b!=b.b) return a.b>b.b;
else return a.a>b.a;
}
int main(){
int cnt=;
while(~scanf("%d",&N)){
if(N==) break;
int i,j;
for(i=;i<N;++i){
scanf("%d%d",&Node[i].a,&Node[i].b);
}
sort(Node,Node+N,cmp);
ll previd1=Node[].a;
ll mx=previd1+Node[].b;
for(i=;i<N;++i){
previd1+=Node[i].a;
mx=max(mx,previd1+Node[i].b);
}
printf("Case %d: %lld\n",++cnt,mx);
}
return ;
}
经典贪心算法uva11729的更多相关文章
- [经典贪心算法]Prim算法
最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...
- 经典贪心算法(哈夫曼算法,Dijstra单源最短路径算法,最小费用最大流)
哈夫曼编码与哈夫曼算法 哈弗曼编码的目的是,如何用更短的bit来编码数据. 通过变长编码压缩编码长度.我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit.但在很多情况下,数 ...
- 关于贪心算法的经典问题(算法效率 or 动态规划)
如题,贪心算法隶属于提高算法效率的方法,也常与动态规划的思路相挂钩或一同出现.下面介绍几个经典贪心问题.(参考自刘汝佳著<算法竞赛入门经典>).P.S.下文皆是我一个字一个字敲出来的,绝对 ...
- 【十大经典数据挖掘算法】AdaBoost
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
- js算法初窥05(算法模式02-动态规划与贪心算法)
在前面的文章中(js算法初窥02(排序算法02-归并.快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而 ...
- Java 算法(一)贪心算法
Java 算法(一)贪心算法 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.贪心算法 什么是贪心算法?是指在对问题进行求 ...
- 【BZOJ】1828: [Usaco2010 Mar]balloc 农场分配(经典贪心)
[算法]贪心+线段树 [题意]给定n个数字ci,m个区间[a,b](1<=a,b<=10^5),每个位置最多被ci个区间覆盖,求最多选择多少区间. 附加退化问题:全部ci=1,即求最多的不 ...
- hdoj2037 贪心算法——今年暑假不AC
所谓“贪心算法”是指:在对问题求解时,总是作出在当前看来是最好的选择.也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明). 经典问题:时间序列问题 ...
随机推荐
- javascript 解析dom字符串
知识要求:1:熟悉dom结构层次(如childNodes,nodeType,parent,children)等. 2:熟悉jq对象转换js 对象,反之 毕竟不是专业js人.借助第3方框架.其实jq也是 ...
- Java for LeetCode 234 Palindrome Linked List
解题思路: O(1)的空间复杂度,意味着不能通过开一个List来解决问题.我们可以把List分成前后两个部分,后半部分通过指针的相互赋值进行翻转即可. JAVA实现如下: public static ...
- Python: 安装BeautifulSoup4
python3.4.3 安装BeautifulSoup4: 使用pip install 安装: 在命令行cmd之后输入,pip install BeautifulSoup4 BeautifulSoup ...
- hdu 1972.Printer Queue 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1972 题目意思:需要模拟打印机打印.打印机里面有一些 job,每个job被赋予1-9的其中一个值,越大 ...
- js中 map 遍历数组
map 方法会迭代数组中的每一个元素,并根据回调函数来处理每一个元素,最后返回一个新数组.注意,这个方法不会改变原始数组. 在我们的例子中,回调函数只有一个参数,即数组中元素的值 (val 参数) , ...
- android中判断网络连接是否可用
一.判断网络连接是否可用 public static boolean isNetworkAvailable(Context context) { ConnectivityManager cm = (C ...
- 【leetcode】Single Number II (medium) ★ 自己没做出来....
Given an array of integers, every element appears three times except for one. Find that single one. ...
- iOS push与present Controller的区别
push与present都可以推出新的界面.present与dismiss对应,push和pop对应.present只能逐级返回,push所有视图由视图栈控制,可以返回上一级,也可以返回到根vc,其他 ...
- August 22nd 2016 Week 35th Monday
Have you ever given any thought to your future? 你有没有为将来打算过呢? Have you ever given any thought to your ...
- 赛车比赛(洛谷U4566)
题目背景 kkk在赛车~ 题目描述 现在有N辆赛车行驶在一条直线跑道(你可以认为跑道无限长)上.它们各自以某种速度匀速前进,如果有两辆车A车和B车,A车在B车的后面,且A车的速度大于B车的速度,那么经 ...