随笔分类 - 贪心
摘要:简单贪心,贪心原则是将每一个单调序列尽可能的大。#include<iostream>#include<cstdio>#include<cstring>using namespace std;int data[100001];int work(int m,int n){ int head=m+1,count=0; if(n-m<=1) return 1; while(head<=n) { count++; while(data[head]==data[head-1]) head++; if(data[head]>data[head...
阅读全文
摘要:用动态规划超时了,悲剧,没想到可以用贪心O(n)就搞定了。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{ int x,y;}vert[100010];int res[100010];int cmp(node a,node b){ return a.x < b.x;}int work(int n,int m){ int i,k=0,max=0,count=0,pre=0; if(n==0
阅读全文
摘要:一道较难的贪心题,看了看大牛的博客才渐渐有了思路:贪心原则应该是Ci大的尽量先染色,但是由于父节点染了才能染子节点的限制使得问题不好解决了,但是Ci大的一定是在其父节点染色后立即被染色,这时大牛们的思路我也没有看明白如何证明的,但仔细一想就明白了。于是我们根据这个条件就可以将Ci大的点与其父节点合并在一起组成一个集合。这样就可以将问题规模减小。 合并后的点(即集合)的属性如何变化呢?假如设fact[i]表示集合的Ci和,iNum[i]表示i所属集合的结点个数;那么把fact[i]/iNum[i]作为贪心原则,其值大者先合并到其父节点,最终合并成一个集合。答案是怎么得出来的我看了很长时间才明白。
阅读全文