求pascal贪心题目:线段覆盖——程序;请按照以下思路编写程序:首先说一下,我第一次见到这道题是在百度noip贴吧的一位吧友共享的《基本程序题集》中.在该吧友给出的题解中这样写到:

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/04 15:34:37
求pascal贪心题目:线段覆盖——程序;请按照以下思路编写程序:首先说一下,我第一次见到这道题是在百度noip贴吧的一位吧友共享的《基本程序题集》中.在该吧友给出的题解中这样写到:

求pascal贪心题目:线段覆盖——程序;请按照以下思路编写程序:首先说一下,我第一次见到这道题是在百度noip贴吧的一位吧友共享的《基本程序题集》中.在该吧友给出的题解中这样写到:
求pascal贪心题目:线段覆盖——程序;
请按照以下思路编写程序:首先说一下,我第一次见到这道题是在百度noip贴吧的一位吧友共享的《基本程序题集》中.在该吧友给出的题解中这样写到:“贪心策略为从左到右,每次选取线段右端点坐标最小的线段.保留这条线段,并把和这条线段有公共部分的所有线段删除.证明:因为右端点坐标最小,可保证所有与这条线段没有公共部分的线段都在这条线段的右边,且所有与这条线段有公共部分的线段两两之间都有公共部分,而右端点坐标最小的线段对后面的线段影响最小.”如果直接写出这样的程序,语言和循环会很乱.我做了以下优化.1、读入数据时对于左端点相同的点,只保留右端点最小的.2、没必要“删除线段”之类的.用一个变量统计剩下线段数就行了.3、优化存储结构,不用二维数组存每条线段左右端点,改用一维数组.具体请见“程序”中第一条.程序:1、读入数据.用一个1..2000的数组road【k】储存线段信息.对于k属于1~2000,road[k]的值代表左端点为k的线段右端点的值.{这样做是为了省掉排序并降低空间复杂度}2、选择“当前剩下的线段中 左端点最小的那条线段”.若没有线段了就结束.3、从该线段左端点遍历至右端点,若 其中没有其他线段的右端点,则总线段数+1,从当前线段右端点继续遍历(执行步骤2);否则记录其他线段右端点中最小的一个,总线段数+1,并从这个最小右端点的线段的右端点开始继续遍历(执行步骤2).4、输出总线段数.这样做貌似是2重循环O(n^2)的复杂度,实际上最多只可能循环2000+100次;只用了一个一维数组1..2000,空间复杂度为O(m).因此我的程序只用了1MS就通过了.
PS:求完整代码,后期有附加加分,若有注释,

求pascal贪心题目:线段覆盖——程序;请按照以下思路编写程序:首先说一下,我第一次见到这道题是在百度noip贴吧的一位吧友共享的《基本程序题集》中.在该吧友给出的题解中这样写到:
program ex1214;vara:array[1..100,1..2]of longint;f:array[1..100]of longint;n,i,j,k:longint;function max(x,y:longint):longint;begin if x>y then max:=x else max:=y; end;//较大值函数procedure readd;var p:longint;beginreadln(n);for i:=1 to n dobeginreadln(a[i,1],a[i,2]);if a[i,1]>a[i,2] then begin p:=a[i,1]; a[i,1]:=a[i,2]; a[i,2]:=p; end;end;for i:=1 to n do f[i]:=1;end;//读入数据procedure sort;var p:array[1..2]of longint;beginfor i:=1 to n-1 do for j:=i+1 to n doif a[i,1]>a[j,1] then begin p:=a[i]; a[i]:=a[j]; a[j]:=p; end;end;//排序procedure work;beginfor i:=n-1 downto 1 do for j:=i+1 to n doif a[i,2]k then k:=f[i];//for i:=1 to n do writeln(a[i,1],' ',a[i,2],' ',f[i]);writeln(k);end;//工作部分beginreadd;sort;work;end.//主程序

求pascal贪心题目:线段覆盖——程序;请按照以下思路编写程序:首先说一下,我第一次见到这道题是在百度noip贴吧的一位吧友共享的《基本程序题集》中.在该吧友给出的题解中这样写到: 一道poj上的题目求poj2253 的pascal程序 Pascal 程序 求改错!RT:题目为:题目描述 Description国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的.比如一条项链,我们用AB来表示,不同 求PASCAL背包问题和无限背包思路和程序 求一个背包程序(PASCAL)最原始的 Miller-Rabbin素数测试法求一个用Miller-Rabbin算法判断是否为素数的程序,注意要用PascalPascal!Pascal!Pascal!Pascal!Pascal!Pascal!Pascal!Pascal!最好有说明 pascal语言编程问题(free pascal求1—N中的素数的个数.(1 975*935*972*( ),要使这四个数的连积在末尾四个数字都是0,最小填什么 求编程题目.要Pascal的程序. pascal编程题目 计算1—50中既不能被3整除也不能被4整除的所有整数之和用pascal编程序计算1—50中既不能被3整除也不能被4整除的所有整数之和 pascal两数平均数程序 pascal高精度快速幂程序 求各种斐波那契数列的pascal题目! 做一道PASCAL题目输出2——n之间的所有素数(质数). pascal问题,求程序:1、 文本文件t.in中第一行的一个 正整数N(N 求Free Pascal程序问题如下:第一行输入一个正整数n(1 用PASCAL语言编写一个求1+2+3+...+N的程序 pascal程序 输入一个数,求它的绝对值、平方、平方根,前趋,后继 线段覆盖 怎么DP 我是pascal就是用最少的线段,来覆盖 一段区间 比如说 a[i]是线段起点 b[i]是线段终点 for i:=1 to nd ofor j:=1 to i do if a[i]>=b[j] then f[i]=min(f[j]+1) 是这样吗 输入是 n(表示线段数)后