- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1751【差分约束】Intervals(区间)
【差分约束】Intervals(区间)
Time Limit:2000MS? Memory Limit:65536KTotal Submit:4 Accepted:4
Description
区间(intervals.pas/c/cpp) 【问题描述】 给定n个封闭的整数区间[ai, bi] i 1,2,...,n 和n个整数c1, ..., cn。 编写一个程序: 计算一个最少点数的点集Z,使得Z在第i个区间中的点的数量至少为ci,i 1,2,...,n。
Input
第一行包括一个整数n 1 n 50000 ,表示区间的数量。 接下来n行每行包括三个整数,ai,bi,ci,其中0 ai bi 50000,1 ci bi - ai+1。
Output
输出一个整数,表示点集Z中点的数量。
Sample Input
5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1
Sample Output
6
Hint
本题数据不完整,请在本系统测试通过后到/problem?id 1201 提交完整测试!
Source
Southwestern Europe 2002
大致题意:
给出数轴上的n个区间[ai,bi],每个区间都是连续的int区间。
现在要在数轴上任意取一堆元素,构成一个元素集合V
要求每个区间[ai,bi]和元素集合V的交集至少有ci不同的元素
求集合V最小的元素个数。
解题思路:
POJ1716的升级版,只是边权不是固定,而是变化的而已
其实只要把POJ1716的 范围 和“固定边权2”改为ci 就能直接AC了
注意本题只能用差分约束+Relax解决,不能像POJ1716那样用贪心。
POJ1716:/座机电话号码6/blog/1座机电话号码6
建议先去把我做1716的方法看懂了,再来做这题,不过我还是重述一下思路:
设s[x] 从0 到x 的所有在集合中的数的个数
则ai到bi的个数即S[bi] - S[ai-1]。因此有
1 S[bi] - S[ai-1] ci。
又根据s[x]本身的性质,后面的一定不比前面的小,后面的最多比前面多一,有: 2 ?s[i + 1] - s[i] 0 3 ?s[i + 1] - s[i] 1故建图,使图中每一组边,均满足(注意三条式子的不等号方向要一致,这个很重要):S[ai - 1] S[bi] - ci S[i] S[i - 1] + 1 S[i - 1] S[i]
上面三式,可把s[x]看作源点(假设存在)到各点的最短距离,初始化为0;
常数为边 ai – 1,bi 的边权
当存在不满足这三条式子的边时,对这条边进行Relax操作,更新不等号左边的变量。
其实就是Bellman-Ford算法的核心部分
if S[ai - 1] S[bi] – 2 S[ai - 1] S[bi] – ci ;
if S[i] S[i - 1] + 1 S[i] S[i - 1] + 1 ;
if S[i - 1] S[i] S[i - 1] S[i] ;
最后源点到最大顶点的距离减去源点到最小顶点的距离就是所求(其实一个单位距离就代表V中的一个元素;最小顶点到最大顶点其实就是所有输入的区间中,最小的左端点到最大的右端点这个范围)。
var i,j,n,m,min:longint;
a:array[-1..50000,1..3] of longint;
d:array[-1..50000] of longint;
procedure Bellman_Ford;
var i,j:longint;
flag:boolean;
begin
flag: true;
fillchar d,sizeof d ,0 ;
while flag do begin flag: false; for j: 1 to n do if d[a[j,1]] d[a[j,2]]+a[j,3] then begin d[a[j,1]]: d[a[j,2]]+a[j,3]; flag: true; end; for i: min to m do begin if d[i] d[i-1] then begin d[i-1]: d[i]; flag: true; end; if d[i] d[i-1]+1 then begin d[i]: d[i-1]+1; flag: true; end; end;
end;
end;
begin readln n ; m: 0; min: 座机电话号码; for i: 1 to
原创力文档


文档评论(0)