AOJ.870 MAX 的读书计划

来源:互联网 发布:badusb淘宝 编辑:程序博客网 时间:2024/06/06 17:54

Time Limit: 1000 ms   Memory Limit: 50 MB
Total Submission: 8   Submission Accepted: 3
Judge By Case
Description
MAX 很喜欢读书,为了安排自己的读书计划,他会预先把要读的内容做好标记, A B 表
示一个页段,即第 A 到 B 面,当然 A<b,若有两个页段 a-b,b-c,则可以直接记为="" a-c,这样,
他就可以一次看完,现在告诉你 n 个页段,请你帮他求出最长的一条页段,并输出这条页段
的长度和组成它的页段个数。举个例子:
有 6 个页段:
2-7 1-3 3-12 12-20 7-10 4-50
那么连续的页段就有:
1-3, 3-12, 12-20 长度为 20-1+1=20 由 3 个页段组成
2-7, 7-10 长度为 10-2+1=9 由 2 个页段组成
4-50 长度为 50-4+1=47 由 1 个页段组成
那么最长的一条就是第三个,所以结果为 47 1。
需要注意的是:如果有两条不一样的连续的页段长度同时为最大,那么取组成页段数多
的一条.
例子: 1-5,5-10,1-10
输出: 10 2

Input
文件的第一行为一个整数 n, n<500;
第二行到第 n+1 行,每行两个整数 A B,记录一个页段的信息。 0<=A<b<500< div="">
Output
输出一个整数,即最长的页段的长度和组成它的页段数。

Sample Input
OriginalTransformed
71 510 123 102 72 1012 167 9
7[EOL] 1[SP]5[EOL] 10[SP]12[EOL] 3[SP]10[EOL] 2[SP]7[EOL] 2[SP]10[EOL] 12[SP]16[EOL] 7[SP]9[EOF] 

Sample Output
OriginalTransformed
15 3
15[SP]3[EOL] [EOF] 

Hint
1-5 长度为 5 由 1 个页段组成
3-10,10-12,12-16 长度为 14 由 3 个页段组成
2-7,7-9 长度为 8 由 2 个页段组成
2-10,10-12,12-16 长度为 15 由 3 个页段组成
所以输出最长的页段的长度即 15 由 3 个页段组成

【数据规模】
对于 30%的数据
n<20
0<=A<b<500
对于 100%的数据
n<500
0<=A<b<500< div=""> 
<b<500
<b<500< div="">


#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<iostream>#include<algorithm>#include<vector>//#define DEBUGusing namespace std;const int maxn = 550, INF = 1e9 + 1;int a[maxn][maxn],d[maxn];//d[i]表示到i的最长路int main(){#ifdef DEBUGfreopen("Text.txt", "r", stdin);#endif // DEBUGint n, i, j,end=0, ans1 = 0, ans2,path[maxn];scanf("%d", &n);for (i = 1; i <= n; i++) {int x, y;scanf("%d %d", &x, &y);a[x][y] = y - x + 1;end = max(end, y);}memset(d, 0, sizeof(d));memset(path, 0, sizeof(path));for (i = 0; i <= end; i++) {for (j = 0; j < i; j++) {if (a[j][i]) {if (d[j] != 0) {if (d[i] < d[j] + a[j][i]) {d[i] = d[j] + a[j][i] - 1;path[i] = j;}}else {d[i] = max(d[i], a[j][i]);}}}}//求最长路int a,b;ans2 = 1;for (i = 0; i <= end; i++) {if (d[i] > ans1) ans1 = d[i];}//同长的情况下求最长页段for (i = 0; i <= end; i++) {if (d[i] == ans1) {b = 1, a = i;while (path[a] != 0) {b++;a = path[a];}ans2 = max(ans2, b);}}printf("%d %d\n", ans1, ans2);return 0;}

<b<500< div="">


<b<500


<b<500< div="">



0 0
原创粉丝点击