hdu 1050解题报告
2014-05-01 22:52
267 查看
题意:
在一个宾馆里把一个桌子从一个房间i移到房间j但是在移动的过程中房间i和房间j之间的走廊会被占用。每一次的移动需要10钟的时间,问把所有的桌子移动完毕至少需要多长时间。
思路:
这是一道贪心算法的题目,把每一个桌子的移动按起始房间编号排序(这里规定起始房间的编号小于目的房间的编号)
然后采取贪心策略,假设cur代表的是第cur个桌子的移动那么对于其他的桌子i只要i满足桌子i还没有被移动,并且桌子i的移动不会和桌子cur的移动造成冲突。那么这两个桌子就可以同时移动。以此类推扫描整个数组即可。下面是通过的代码:
在一个宾馆里把一个桌子从一个房间i移到房间j但是在移动的过程中房间i和房间j之间的走廊会被占用。每一次的移动需要10钟的时间,问把所有的桌子移动完毕至少需要多长时间。
思路:
这是一道贪心算法的题目,把每一个桌子的移动按起始房间编号排序(这里规定起始房间的编号小于目的房间的编号)
然后采取贪心策略,假设cur代表的是第cur个桌子的移动那么对于其他的桌子i只要i满足桌子i还没有被移动,并且桌子i的移动不会和桌子cur的移动造成冲突。那么这两个桌子就可以同时移动。以此类推扫描整个数组即可。下面是通过的代码:
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> using namespace std; const int maxn = 1000+10, inf = -100000; typedef struct { int s, t; }Node; Node a[maxn]; bool visit[maxn]; bool cmp(Node x, Node y) { return x.s < y.s; } int max(int x, int y) { return x > y ? x : y; } int min(int x, int y) { return x < y ? x : y; } int main() { int T = 0; int n = 0; scanf("%d",&T); a[0].s = a[0].t = inf; while(T--) { scanf("%d",&n); int x = 0, y = 0; for(int i = 1; i <= n; i++) { scanf("%d%d",&x,&y); a[i].s = min(x,y); a[i].t = max(x,y); } sort(a+1,a+n+1,cmp); memset(visit,false,sizeof(visit)); int count1 = 0,ans = 0; while(count1 < n) { ans += 10; int k = 0; for(int i = 1; i <= n; i++) { if(a[i].s%2 == 0) { if(!visit[i] && a[i].s-a[k].t > 1) { visit[i] = true; count1++;k = i; } } if(a[i].s%2) { if(!visit[i] && a[i].s > a[k].t) { visit[i] = true; count1++; k = i; } } } } printf("%d\n",ans); } return 0; }
相关文章推荐
- Unity3D之简单的帧动画
- DevExpress Ribbongallerybaritem选择性皮肤重组
- Sum of Consecutive Prime Numbers
- iOS7 UIKit Dynamics
- Unity3D 窗口裁剪
- 主存
- SpringMVC入门
- 寻找素数对
- 游戏对象的实现
- C++程序设计项目开发——银行自动提款机(一)
- windows phone 7 webBrowser中文乱码问题
- perl模块之Smart::Comments
- Benchmark of Python WSGI Servers
- 23种设计模式
- Goldbach's Conjecture
- 90. 啰唆的的日志会打断你的睡眠
- 正则 4000 表达式的使用--去除字符串中空格
- blog
- 设计模式目录
- hdu1698 Just a Hook