8.4.1 最优装载问题
略
8.4.2 部分背包问题
按照比值计算
8.4.3 乘船问题
这个题目应该先拍好序吧= =
8.4.4 选择不相交区间
长度方面选短的,优先选靠前的。
c
#include <stdio.h> #include <algorithm> using namespace std; struct interval { int a, b; }; int cmp(interval a, interval b) { return a.a < b.a; } const int MAXN = 10000; const int INF = 10000000; int main(int argc, const char *argv[]) { interval a[MAXN]; int n; while(~scanf("%d", &n)) { for(int i = 0; i < n; i++) scanf("%d%d", &a[i].a, &a[i].b); sort(a, a+n, cmp); // for(int i = 0; i < n; i++) // printf("%d %d\n", a[i].a, a[i].b); int pre = 0,cnt = 1; for(int i = 1 ; i < n; i++) { if(a[pre].b > a[i].b) pre = i; if(a[i].a > a[pre].b) { cnt ++; pre = i; } } printf("%d\n", cnt); } return 0; }
8.4.5 区间选点问题
选最头上的点。。
c
#include <stdio.h> #include <algorithm> using namespace std; struct interval { int a, b; }; int cmp(interval a, interval b) { if(a.b != b.b) return a.b < b.b; return a.a > b.a; } const int MAXN = 10000; const int INF = 10000000; int main(int argc, const char *argv[]) { interval a[MAXN]; int n; while(~scanf("%d", &n)) { for(int i = 0; i < n; i++) scanf("%d%d", &a[i].a, &a[i].b); sort(a, a+n, cmp); // scanf("%d%d", &s, &t); // for(int i = 0; i < n; i++) // printf("%d %d\n", a[i].a, a[i].b); int cnt = 1; int pre = a[0].b; for(int i = 1; i < n; i++) { if(pre < a[i].a) { cnt++; pre = a[i].b; } } printf("%d\n", cnt); } return 0; }
8.4.6 区间覆盖问题
优先选覆盖较长的区间...
c
#include <stdio.h> #include <algorithm> using namespace std; struct interval { int a, b; }; int cmp(interval a, interval b) { return a.a < b.a; } const int MAXN = 10000; const int INF = 10000000; int main(int argc, const char *argv[]) { interval a[MAXN]; int n, s, t; freopen("input", "r", stdin); while(~scanf("%d", &n)) { for(int i = 0; i < n; i++) scanf("%d%d", &a[i].a, &a[i].b); sort(a, a+n, cmp); scanf("%d%d", &s, &t); for(int i = 0; i < n; i++) printf("%d %d\n", a[i].a, a[i].b); int cnt = 1; int pre; if(a[0].a < s) pre = a[0].b; else { puts("-1"); continue; } for(int i = 1; i < n; i++) { if(a[i].a > s) { cnt++; s = pre; } if(a[i].a <= s && pre < a[i].b) pre = a[i].b; if(pre >= t) break; } if(pre >= t) printf("%d\n", cnt); else puts("-1"); } return 0; }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。