【算法】模拟 【难度】★☆☆☆☆
这是一道区间合并问题。我的算法如下;
对于输入数据:
读入时开一个二维数组tt,按顺序读入300,1000,700,1200,1500,2100;
其中区间开头的数值做标记1,区间终点做标记-1;
这样tt就变成了:
对于输入数据:
3 300 1000 700 1200 1500 2100可得三个区间[300,1000][700,1200][1500,2100]
读入时开一个二维数组tt,按顺序读入300,1000,700,1200,1500,2100;
其中区间开头的数值做标记1,区间终点做标记-1;
这样tt就变成了:
[i][0] | 300 | 1000 | 700 | 1200 | 1500 | 2100 |
[i][1] | 1 | -1 | 1 | -1 | 1 | -1 |
然后顺序遍历这个数组;
开一个计数器变量ct=0;
每当当前的数标记为1时ct++,标记为-1时ct--;
每当ct恰好==0时就完成了一个大区间合并;
其他工作就好做了;
开一个计数器变量ct=0;
每当当前的数标记为1时ct++,标记为-1时ct--;
每当ct恰好==0时就完成了一个大区间合并;
其他工作就好做了;
也可以理解为离散化;
【收获】离散化的区间处理
【收获】离散化的区间处理
View Code
1 /*
2 ID: wsc5001
3 LANG: C
4 TASK: milk2
5 */
6 #include <stdio.h>
7 #include <stdlib.h>
8 long int tt[10010][2]={0};
9 void quicksort (int f,int r)
10 {
11 int i,j;
12 long int t0,t1;
13 i=f;
14 j=r;
15 t0=tt[i][0];
16 t1=tt[i][1];
17 while (i<j)
18 {
19 while (i<j&&tt[j][0]>t0){j--;}
20 if(i<j)
21 {
22 tt[i][0]=tt[j][0];
23 tt[i][1]=tt[j][1];
24 i++;
25 }
26 while (i<j&&tt[i][0]<t0){i++;}
27 if(i<j)
28 {
29 tt[j][0]=tt[i][0];
30 tt[j][1]=tt[i][1];
31 j--;
32 }
33 }
34 tt[i][0]=t0;
35 tt[i][1]=t1;
36 if (i-1>f)
37 quicksort(f,i-1);
38 if (j+1<r)
39 quicksort(j+1,r);
40 }
41 int main()
42 {
43 FILE *fin,*fout;
44 fin=fopen("milk2.in","r");
45 fout=fopen("milk2.out","w");
46 int n;
47 int i,j,t,flag=1;
48 long int a,b,f,r,tf,maxk=0,maxm=0,q,w;
49 long int temp[2][2];
50 fscanf(fin,"%d",&n);
51 //读入时间表
52 //开始时刻标记1 结束时刻标记-1
53 for (i=0;i<2*n;i++)
54 {
55 fscanf(fin,"%ld",&tt[i][0]);
56 tt[i][1]=flag;
57 flag=flag*-1;
58 }
59 //按时间先后排序
60 quicksort(0,2*n-1);
61 a=tt[0][0];
62 q=0;//计数
63 //a 是起点 b 是终点
64 for (i=0;i<2*n;i++)
65 {
66 if (tt[i][1]==1)
67 q++;
68 if (tt[i][1]==-1)
69 q--;
70 if (q==0)
71 {
72 b=tt[i][0];
73 tf=b-a;
74 if (tf>maxk)
75 maxk=tf;
76 tf=tt[i+1][0]-b;
77 if (tf>maxm)
78 maxm=tf;
79 a=tt[i+1][0];
80 }
81
82 }
83 fprintf(fout,"%ld %ld\n",maxk,maxm);
84 //system("pause");
85 fclose(fin);
86 fclose(fout);
87 }