此题看来是数学题,有思路很简单。
/*
* hdu-1050
* mike-w
* 20120-4-8
* ************************************************
* 把每一次移动看成是从S到T绘制一条线段,那么最少的
* 总移动次数就是线段的最大重叠次数。
* PROOF:
* 首先,总移动次数不少于最大重叠次数(记为x),这是明显的,
* 因为重叠的线段每次只能绘制一条。
* 这样我们只需说明用x次可以绘制所有线段。
* 对于重叠数最大(重叠数记为m)的两个区域,我们可以选出两个不相交的线段,
* (否则最大重叠数将是m+1)
* 这样,每次操作最大重叠数都减少1,=》DONE!
* *********************************************************************
* 貌似我的表达能力有些问题==!望体会精神。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 512
int f[MAX_SIZE];
int T,N;
int swap(int *e1, int *e2)
{
int tmp=*e1;
*e1=*e2;
*e2=tmp;
return 0;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int i,j,e1,e2,max;
scanf("%d",&T);
while(T-->0)
{
scanf("%d",&N);
memset(f,0,sizeof(f));
for(i=0;i<N;i++)
{
scanf("%d%d",&e1,&e2);
if(e1>e2)
swap(&e1,&e2);
if(e1&0x1) e1++;
if(e2&0x1) e2++;
for(j=e1;j<=e2;j++)
f[j]++;
}
max=0;
for(i=1;i<=400;i++)
if(f[i]>max)
max=f[i];
printf("%d\n",max*10);
}
return 0;
}
619

被折叠的 条评论
为什么被折叠?



