求时间的集合天数快速算法

20011521 2010-06-28 02:42:34
在项目中查询一段时间是否被占用,如没有占用返回时间段
比喻说查询开始时间 2010-01-02 到 2010-01-30没有被占用的时间区间
已知被占用的时间段 A集合 2010-01-03 到 2010-01-05
预占用的时间段 B集合 2010-01-07 到2010-01-08
求出C集合出来
也就是 2010-01-02 到2010-01-03
2010-01-05 到 2010-01-07
2010-01-08 到 2010-01-30
如何快速实现
...全文
144 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
捷哥1999 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 20011521 的回复:]
在项目中查询一段时间是否被占用,如没有占用返回时间段
比喻说查询开始时间 2010-01-02 到 2010-01-30没有被占用的时间区间
已知被占用的时间段 A集合 2010-01-03 到 2010-01-05
预占用的时间段 B集合 2010-01-07 到2010-01-08
求出C集合出来
也就是 2010-01-02 到2010-01-03
2010-0……
[/Quote]

开始和结束时间为
StartDay和EndDay
已经占用的时间段是hasUsedStartDay和hasUsedEndDay
预留的时间段是ReserveStartDay和ReserveEndDay

你要的结果就是:
1、先排除占用时间段,剩下的实际时间就是:StartDay-hasUsedStartDay:EndDay-hasUsedEndDay
2、再去掉预留的时间段,剩下的就是你要的结果:
if(ReserveStartDay>hasUsedStartDay && hasUsedStartDay<hasUsedEndDay)
StartDay-hasUsedStartDay:EndDay-ReserveStartDay
else
StartDay-ReserveStartDay:EndDay-hasUsedEndDay
else
tartDay-hasUsedStartDay:EndDay-ReserveStartDay

没有其他的判断方法,只能去计算!
wuyq11 2010-06-28
  • 打赏
  • 举报
回复
时间排序
自定义实体类,通过 LINQ的Intersect(交集),Except(差集)计算
frankworld 2010-06-28
  • 打赏
  • 举报
回复
先建一个总的集合,然后把已经占用的删除就可以了。
这问题不负责,关键是看具体环境。
兔子-顾问 2010-06-28
  • 打赏
  • 举报
回复
没啥通用性的问题。你自己对排除的时间排序,依次的做判断不就可以了。关键是你返回的也是几个时间的间隔点,最终判断还是要总结的写个方法。
Shelly89 2010-06-28
  • 打赏
  • 举报
回复
没看明白,帮顶
lostuser 2010-06-28
  • 打赏
  • 举报
回复
留个脚印
dobear_0922 2010-06-28
  • 打赏
  • 举报
回复
如果确定,A和B没有交集,可能这么做:
1.从原集合中去掉A集合占用的区间:
 a.如果A的开始时间晚于原集合开始时间:添加区间原集合开始时间-A集合开始时间到集合C
 b.如果A的结束时间早于原集合结束时间:添加区间A集合结束时间-原集合结束时间到集合C
2.从C集合去掉B集合占用的区间:
 a.判断B集合是否属于C集合的某个子区间,属于则从该子区间中去掉B集合占用的区间,方法同1(可递归实现).
yaazz 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 20011521 的回复:]

请问补集如何实现
[/Quote]
循环AB并集求补集
上一个被占用的时间区间的结束为未占用时间区间开始
下一个被占用的时间区间的开始为未占用时间区间结束
首尾用你的查询区间
20011521 2010-06-28
  • 打赏
  • 举报
回复
请问补集如何实现
yaazz 2010-06-28
  • 打赏
  • 举报
回复
先求AB并集,再求补集
循环AB并集求补集
xiao0 1.c //纵向乘法表 2.c //标准乘法表 3.c //冒泡排序 4.c //验证算式正确 5.c //判断几位数 6.c //实现二维数组的最大值 7.c //实现猜数 8.c //实现各位相加 9.c //实现字符个数 10.c //单词个数 xiao1 11.c //实现密码验证 12.c //实现str算法 13.c //折半法找数 14.c //递归汉诺 15.c //选择法排序 16.c //局部变量的生存期 17.c //全局变量的作用域 18.c //神奇的 i++ 19.c //预编译处理 20.c //神奇的指针 xiao.txt //刷题思路 xiao2 21.c //数组指针 22.c //出题验证系统 23.c //二维数组指针 24.c //秀秀指针 25.c //多级指针的应用 26.c //位运算 27.c //结构体变量 28.c //结构体指针 29.c //静态链表 30.c //动态链表 xiao3 31.c //共用体 32.c //文件的打开与关闭 33.c //文件的读和写 34.c //文件的块读 35.c //逆序输出 36.c //用指针的数值传递 37.c //if(0.5);if中的局部变量 38.c //指针交换地址不改原值 39.c //指针实现逆序输出 40.c //结构体传值 xiao4 41.c //结构体传数组值 42.c //结构体的各种赋值 43.c //结构体函数 44.c //结构体二维数组 45.c //学生信息管理系统 46.c //结构体函数 47.c //二维数组转一维 48.c //if(1?i>j:i求根 8.cpp //利润 9.cpp //圆周率pi的近似值 10.cpp //Fibonacci数列 xiao1 11.cpp //分数序列和 12.cpp //有序插入 13.cpp //数组元素逆置 14.cpp //杨辉三角 15.cpp //解密 16.cpp //比较两个字符串大小 17.cpp //冒泡排序 18.cpp //矩阵转置 19.cpp //字符串最大值 20.cpp //复制字符串中的元音字母 xiao2 21.cpp //计算若干整数的和 22.cpp //神奇的c++stl库函数 23.cpp //最大最小数 24.cpp //全排列 25.cpp //数组逆置输出 26.cpp //set(集合) 27.cpp //vector(不定长数组) 28.cpp //map(映射) 29.cpp //结构体swap 30.cpp //结构体sort xiao3 31.cpp //计算两日期间隔 32.cpp //加密4个数 33.cpp //计算日期星期 34.cpp //queue(队列) 35.cpp //stack(栈) 36.cpp //sort 37.cpp //结构体sort 38.cpp //奶牛日光浴 39.cpp //lower_bound 40.cpp //贪心看电视 xiao4 41.cpp //两边同时减 42.cpp //贪心安排会场 43.cpp //iterator 44.cpp //背包问题 45.cpp //取数排列 46.cpp //全排列 47.cpp //节点 48.cpp //节点 49.cpp //村庄修公路 50.cpp //差分数组 xiao5 51.cpp //最大子段和 52.cpp //map应用 53.cpp //ASCII码排序 54.cpp //我的排序 55.cpp //隐藏的时间 56.cpp //好年份 57.cpp //最大最小值 58.cpp //由两天推日期 59.cpp //目标和 60.cpp //统计字符 xiao6 61.cpp //计算天数 62.cpp //统计单词
村里有唯一一个泥瓦匠叫Kemo,很多人需要找Kemo修房子、修灶台、造花园……等,大家可以向Kemo预约修葺的时间和工钱。 现在情况是: 1)Kemo只有一个人,不能同时为两个雇主工作 2)Kemo只有干完一个雇主家的活才可以在接下来的一天切换到另一个雇主家里干活。未干完一份活不可以离开,不可以为多位雇主交叉时间干活 3)Kemo如果不能在预约的时间那天应约的话,这个雇主的这份钱就挣不到了 Kemo比较聪明,他把大家的预约收集好,想让自己忙碌一阵子,赚最多的钱。现在请你为这个忙碌而又贪心的Kemo设计一个思路吧。 Input 输入4行: 第一行,一个数字,n,表示n个人向Kemo预约需要修葺(n<=100) 第二行,n个正数,表示这n个人所需完成修葺的时间的起始点。若时间点为8,表示第8天开始 第三行,n个正数,表示这n个人所需完成修葺的工程天数。若天数为3,表示这一工程必须维持3天完成(所有工程都可以在第1000天内完成,即起始点+工期<=1000) 第四行,n个正数,表示这n个人能向Kemo付出的工钱,工钱以每天计 Output 输出:忙完这阵子,Kemo最多能挣多少钱? 例如:4个人需要找Kemo修葺,起始时间、工期和每天的工钱分别是: 1 3 8 4 3 2 3 2 5 6 10 7 则:Kemo可以获得的最大收益为:5*3+10*3+7*2 = 59 Sample Input 4 1 3 8 4 3 2 3 2 5 6 10 7 Sample Output 59 Hint 此题标题虽有“贪心”,但勿掉入贪心的陷阱中哦(贪心法是解不了滴)。 每项工程有“起始时间”,“工期”和“工钱数”三个性质。若两个工程的从起始时间到结束都不相冲突,就定义这两个工程为“相容工程”。 做子集树,根结点为第1层,叶节点为n+1层。子集树的第i层结点的两个分支代表第i个工程选或者不选。 用回溯算法搜索这n+1层的完全二叉树。 1)若当前工程和之前已选的工程集合不相容,则剪去该分支,不进行该分支之下的搜索,返回到上层结点。 2)将所有满足相容性的可行的叶节点,计算获得的最大工钱数。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧