贪心
算球?
在校学生
展开
-
51nod 1378 夹克老爷的愤怒(树形dp,贪心)
参考:http://blog.csdn.net/u010885899/article/details/49643471 如果还没看标程,就别看了,参考的博客里就是写的标程 首先呢,为了覆盖的点足够多,放置家丁的位置越靠近根节点越好。 然后递归,后序遍历,到叶子节点后,回溯的时候再处理,叶子节点肯定不能放家丁,那样太浪费了,所以叶子节点向父节点请求支援,这时候是-1,然后父节点继续向上请求支援,原创 2017-08-08 16:11:51 · 351 阅读 · 0 评论 -
51nod 1413 权势二进制
十进制下,所有数位中的最大值。。。。这个竟然是二级。。。。#include <bits/stdc++.h>using namespace std;int main(){ int n; cin >> n; int res = 0; while(n) { if(n%10 > res) res = n%10;原创 2017-07-24 18:52:30 · 164 阅读 · 0 评论 -
51nod 1428 活动安排问题
正如讨论里说的:把线段转化成一个入点和一点出点,这样存下2*n个点,之后按坐标从小到大给这2*n个点排序,之后O(n)遍历一遍就好,遇到入点sum++, 遇到出点sum–,遍历时最大的sum便是答案,算上排序复杂度稳定nlogn(注意:排序时坐标相同的点出点优先)#include <bits/stdc++.h>using namespace std;struct action{ int原创 2017-07-25 22:48:12 · 204 阅读 · 0 评论 -
51nod 1099 任务执行顺序
感觉还是这个解释比较有说服力#include <bits/stdc++.h>using namespace std;const int MAXN = 100100;struct task{ int r,o; int der;};task ts[MAXN];bool cmp(const task& a, const task& b){ if(a.der != b.原创 2017-07-26 23:15:07 · 192 阅读 · 0 评论 -
51nod 1117 聪明的木匠
优先队列,每次选出来俩最短的棍子合成的棍子,肯定比别的方案合成的棍子要短,这样每次都找到最短的,结果就是耗费体力最小的。#include <bits/stdc++.h>using namespace std;int main(){ int n,l; scanf("%d",&n); priority_queue<int,vector<int>,greater<int>> q原创 2017-07-26 23:16:55 · 213 阅读 · 0 评论 -
hoj 2430 Counting the algorithms(树状数组,贪心)
记录下第一次出现的位置和 两次出现位置的距离差,按照距离差降序排个序,然后扫一遍。。 我看网上别人做法扫一遍,再扫一遍,完事了,效率比我这要高。。。没想到#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;struct node{ int si,dis;};const int原创 2017-08-11 15:14:37 · 229 阅读 · 0 评论 -
51nod 1625 夹克爷发红包
开始呢,做的时候是选取最小的列和最小的行,然后谁小就替换谁,wa了,想了下,如果每替换一行或一列,就去修改所有受影响的行和列,是不是有点太麻烦了。就网上搜了下:http://blog.csdn.net/f_zyj/article/details/52216205 行最多只有10行,所有的状态一共最多也就1024种,可以把行的这些状态全都枚举出来,选出符合条件的,再去贪心的选取替换哪些列。#incl原创 2017-08-05 10:40:46 · 288 阅读 · 0 评论 -
51nod 1475 建设国家
参考:http://blog.csdn.net/u010885899/article/details/48785763 刚开始看,没思路,看题解。题解的代码太6了 还是太弱了#include <bits/stdc++.h>using namespace std;const int MAXN = 1010;int h,p;int n,H;vector<int> vecs[MAXN];pr原创 2017-08-05 11:10:28 · 218 阅读 · 0 评论 -
51nod 1420 数袋鼠好有趣(贪心)
至少能留下(n+1)/2个袋鼠是可以看得见的,贪心。#include <bits/stdc++.h>using namespace std;const int MAXN = 5e5+10;int num[MAXN];int main(){ int n; scanf("%d",&n); for(int i = 0; i < n; ++i) scanf("%原创 2017-09-14 21:20:20 · 244 阅读 · 0 评论 -
51nod 1255 字典序最小的子序列(贪心)
字典序最小,肯定是升序最小,可是升序不能保证最长。感觉过程就和维护一个单调栈差不多。只是不太单调。 用一个数组保存答案,扫描原字符串,如果当前字符比刚放进数组那个字符小,并且之前的那个字符在之后还会出现,就删掉之前放进数组那个字符,然后当前字符继续和数组最后的那个字符比较,直到数组最后的字符不满足条件“在当前字符之后出现 并且 大于当前字符”,就可以把小的字符放进去了。 等于数组最后字符的当前字符原创 2017-09-15 13:12:18 · 708 阅读 · 0 评论 -
51nod 1191 消灭兔子(贪心)
参考:http://blog.csdn.net/u010885899/article/details/48517051 怎么说呢,想到了一种思路,但是不会实现,很蛋疼。 思路:按照Q币升序排序,血量也是升序排序。先用Q币少的去打血量少的,当碰到一个兔子的血量比伤害要高的时候,可以选择曾经用过的伤害高的箭,和当前的箭对比一下两者能否替换,如果能替换就替换掉,不能替换就继续向后找。不会实现 反观大原创 2017-09-30 11:07:51 · 278 阅读 · 0 评论 -
51nod 1390 游戏得分(贪心)
思路:根据题目可知,每回合的得分为1,3,5,7….2*n-1,是一个等差序列,而且他的每一个前缀和都是平方数,这就说明x+y也要是平方数才能合法。还有就是2分的情况是不存在的,其余的数字都可以。根据给的数据范围,大概就1e6轮游戏,把每轮的的分数打出来,sqrt(x+y)是两人进行的游戏轮数,然后从表里倒着选取分数,当分数够x的时候,就是A最少获胜的盘数了。选取的得分越高,获胜的局数越少。。。。#原创 2017-10-02 15:38:25 · 209 阅读 · 0 评论 -
51nod 1163 最高的奖励
先建一个优先队列,小根堆,然后按照任务的时间升序排序,然后从头开始扫,如果当前的时间没有超过任务的最晚结束时间,就把任务扔到优先队列里,然后继续扫,当扫到某个任务,发现他的最晚结束时间已经过去了,就从优先队列里出来一个最小的,他俩比较,如果当前的任务获得的奖励更高,就把队列里的那个之前的任务替换掉。这样扫完,队列里的任务就是获得奖励最高的任务了。然后加和就好了。#include <bits/stdc原创 2017-07-31 21:49:58 · 224 阅读 · 0 评论 -
51nod 1097 拼成最小的数
排序,两个串a,b,,如果ab < ba,则a在前,否则a在后#include <bits/stdc++.h>using namespace std;const int MAXN = 10010;string strs[MAXN];bool cmp(const string& a, const string& b){ return a+b < b+a;}int main(){原创 2017-07-31 10:07:57 · 255 阅读 · 0 评论 -
51nod 1065 最小正子段和
求前缀和,然后升序排序。排序后相邻两个前缀和只差越小,比如prefixSum[i+1],假设他原来坐标是n,和prefixSum[i],假设他原来坐标是m,他俩差越小,则表明区间(m,n]之间的正整数和越小,前提是n>m。还有排序的时候如果有多个前缀和相等,则把下标大的放在前边,下标小的放后边。 比如输入数据: 4 0 4 1 -1 自己写一下就知道为啥那样排序了。#include原创 2017-07-31 09:03:24 · 228 阅读 · 0 评论 -
51nod 1272 最大距离(贪心)
没想到。。。。 参考:http://blog.csdn.net/qq_21057881/article/details/52739386#include <iostream>#include <algorithm>using namespace std;const int MAXN = 5e4+10;int num[MAXN];int index[MAXN];int main(){原创 2017-06-19 18:15:44 · 280 阅读 · 0 评论 -
hdu 6047 Maximum Sequence
先把b升序排序,这样使用b的时候从小的开始用,这样选择范围大,可以确保开始的时候就能尽量的选到大的aj-j,这样后边得到的aj-j也是尽量的大的。 a数组是动态变化的,而且每次都要选出最大的aj-j,所以用优先队列来维护#include <bits/stdc++.h>using namespace std;const int MAXN = 250010;int b[MAXN*2];const原创 2017-07-30 19:04:32 · 236 阅读 · 0 评论 -
51nod 1205 流水线调度(Johnson规则)
对于加工顺序相同的两个或两个以上作业在两台机器上的加工排序,称之为:n个作业两台机床的作业排序问题,经典的启发式排序方法为Johnson规则。 其目的是最小化Makespan。 资料: https://wenku.baidu.com/view/28dd298751e79b89680226cc.html 这就是个套板子的题目了。。#include <bits/stdc++.h>using n原创 2017-10-03 21:35:31 · 1973 阅读 · 1 评论