贪心基础题(区间调度问题+POJ_3617+POJ_3069)
来源:互联网 发布:佳能打印机安装软件 编辑:程序博客网 时间:2024/06/08 15:15
贪心法就是遵循某种规则,不断贪心地选取当前最优策略的算法设计方法.(贪心法和动态规划的区别)
1.区间调度问题
Q:一共有n项工作,每项工作的起始时间分别为s[i],e[i],你可以自主选择是否参加每项工作,现在希望能够参加最多的工作(每项工作决定了参加就必须全程参与),先想知道最多能参加多少项工作?
分析:这题的策略为贪心法,那么应该按照何种规则进行贪心呢?这里给出了四种贪心策略
(1).每次选取开始时间最早的进行工作
(2).每次选取结束用时最短的进行工作
(3).每次选取最少重叠的进行工作
(4).每次选取结束时间最早的进行工作
通过举反例可知,123规则都不可行,4可行.因为结束的越早,就能够留下更多的时间给后面的活动~
代码略(就是根据结束时间从小到大对活动进行排序,然后看下一个活动的开始时间是否大于结束时间,是的话就可以参加这个活动)
2.POJ_3617 Best Cow Line
题目链接:https://vjudge.net/problem/POJ-3617
分析:给一个定长为N的字符串T,构造一个字符串S,长度也为N,构造规则为任意从T的头或尾取出一个字符(每次取一个),保证最后生成的字符串T的字典序最小.
感觉这题就是要处理一个问题--前后两个字符相等该怎么搞...如果相同的话一直往中间遍历,直至遇见不同,此时就输出大的那边的字符~然后重复操作.
参考代码:
#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int maxn = 1e3+10;int n;char s[2*maxn];char t[2*maxn];int main(){ while( ~scanf("%d",&n)) { for( int i = 1; i <= n; i++) { getchar(); scanf("%c",&s[i]); } int cur = 0; int tmp; int l = 1, r = n; while( l <= r) { int flag = 0; for( int i = 0; l+i <= r; i++) { if( s[l+i] < s[r-i]) { flag = 0; break; } else if( s[l+i] > s[r-i]) { flag = 1; break; } } if( !flag) { t[++cur]= s[l++]; } else { t[++cur] = s[r--]; } } for( int i = 1; i <= cur; i++) { printf("%c",t[i]); if( i%80 == 0) putchar(10); } if( cur%80) putchar(10); } return 0;}
3.POJ_3069 Saruman's Army
题目链接:https://vjudge.net/problem/POJ-3069
分析:一共n个点,位置为x[i],可以在点上放置标记,每个标记可以射击到左右r的距离,问至少放置多少个标志(标志必须放在这n个点上),可以让所有点都能被标记.
参考代码:
#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int maxn = 1e3+10;int r,n;int x[maxn];int main(){while( ~scanf("%d%d",&r,&n)){if( r == -1 || n == -1)return 0;for( int i = 1; i <= n; i++)scanf("%d",&x[i]);sort(x+1,x+1+n);//for( int i = 1; i <= n; i++)//printf("%d ",x[i]);//printf("\n");int cnt = 0;/*int l = x[1];for( int i = 2; i <= n; i++){if( x[i]-l >= r){cnt++;//printf("*%d\n",x[i-1]); int pos; if( x[i]-l == r) pos = i; else pos = i-1; int flag = 1;for( int j = pos; j <= n; j++){if( x[j]-x[pos] > r){l = x[j-1];flag = 0;break;}}if( flag) break;}}*/int i = 1;while( i <= n) { int tmp = x[i]; while( i <= n && x[i] <= tmp+r) i++; tmp = x[i-1]; while( i <= n && x[i] <= tmp+r) i++; cnt++; }printf("%d\n",cnt);}return 0;}
- 贪心基础题(区间调度问题+POJ_3617+POJ_3069)
- 贪心-区间调度问题
- 简单贪心 区间调度问题
- 区间调度问题 ----- 贪心算法
- 区间调度问题-贪心选择
- 区间调度问题(贪心)
- 贪心入门题——看电视(区间调度问题)
- 贪心算法——区间调度问题
- 贪心算法之区间调度问题
- 【贪心算法】区间调度问题总结
- 贪心算法之区间调度问题
- 几个经典的贪心区间问题之区间调度hdu2037
- 贪心算法:区间调度
- 区间调度-贪心算法
- 练习题 No.3 区间调度问题(贪心法)
- 贪心法解决区间调度问题+快速排序
- hdu 2037(贪心算法之区间调度问题)
- 贪心专练1 区间调度最多问题
- index mergefactor理解
- Hibernate4使用注解关系映射
- Android——动画学习,界面切换
- 浅谈Machine Learning
- On the future of neural networks
- 贪心基础题(区间调度问题+POJ_3617+POJ_3069)
- Hbase基本shell命令
- Python文件读取#write()方法之后不能read()出文件内容的解决办法
- jquery常用属性
- Sorgs天气app开发
- plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致
- 计算机硬件基础知识
- Unity3D C#中GUI.TextField的传递
- 439. Ternary Expression Parser