您的位置:首页 > 其它

usaco 1.2.1 Milking Cows 挤牛奶

2012-01-10 21:59 459 查看
usaco 1.2.1

Milking Cows 挤牛奶

这是一道区间合并问题。我的算法如下;

对于输入数据:

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]3001000700120015002100
[i][1]1-11-11-1
然后顺序遍历这个数组;

开一个计数器变量ct=0;

每当当前的数标记为1时ct++,标记为-1时ct--;

每当ct恰好==0时就完成了一个大区间合并;

其他工作就好做了;

代码如下:
/*
ID: wsc5001
LANG: C
TASK: 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 file 工作