usaco 1.2.1 Milking Cows 挤牛奶

来源:互联网 发布:mac电脑怎么用千牛 编辑:程序博客网 时间:2024/06/09 13:42

usaco 1.2.1
Milking Cows 挤牛奶

这是一道区间合并问题。我的算法如下;
对于输入数据:
3300 1000700 12001500 2100
可得三个区间[300,1000][700,1200][1500,2100]
读入时开一个二维数组tt,按顺序读入300,1000,700,1200,1500,2100;
其中区间开头的数值做标记1,区间终点做标记-1;
这样tt就变成了:[i][0]3001000700120015002100[i][1]1-11-11-1然后顺序遍历这个数组;
开一个计数器变量ct=0;
每当当前的数标记为1时ct++,标记为-1时ct--;
每当ct恰好==0时就完成了一个大区间合并;
其他工作就好做了;
代码如下:
/*ID: wsc5001LANG: CTASK: milk2*/#include <stdio.h>#include <stdlib.h>long int tt[10010][2]={0};void quicksort (int f,int r){    int i,j;    long int t0,t1;    i=f;    j=r;    t0=tt[i][0];    t1=tt[i][1];    while (i<j)    {        while (i<j&&tt[j][0]>t0){j--;}        if(i<j)        {            tt[i][0]=tt[j][0];            tt[i][1]=tt[j][1];            i++;        }        while (i<j&&tt[i][0]<t0){i++;}        if(i<j)        {            tt[j][0]=tt[i][0];            tt[j][1]=tt[i][1];            j--;        }    }    tt[i][0]=t0;    tt[i][1]=t1;    if (i-1>f)     quicksort(f,i-1);    if (j+1<r)     quicksort(j+1,r);}int main(){    FILE *fin,*fout;    fin=fopen("milk2.in","r");    fout=fopen("milk2.out","w");    int n;    int i,j,t,flag=1;    long int a,b,f,r,tf,maxk=0,maxm=0,q,w;    long int temp[2][2];    fscanf(fin,"%d",&n);    //读入时间表    //开始时刻标记1  结束时刻标记-1     for (i=0;i<2*n;i++)    {        fscanf(fin,"%ld",&tt[i][0]);        tt[i][1]=flag;        flag=flag*-1;    }    //按时间先后排序     quicksort(0,2*n-1);    a=tt[0][0];    q=0;//计数    //a 是起点 b 是终点     for (i=0;i<2*n;i++)    {        if (tt[i][1]==1)             q++;        if (tt[i][1]==-1)            q--;        if (q==0)        {            b=tt[i][0];            tf=b-a;            if (tf>maxk)                maxk=tf;            tf=tt[i+1][0]-b;            if (tf>maxm)                maxm=tf;            a=tt[i+1][0];        }                }    fprintf(fout,"%ld %ld\n",maxk,maxm);    //system("pause");    fclose(fin);    fclose(fout);}