您的位置:首页 > 其它

POJ 1083 Moving Tables (贪心)

2014-04-25 15:05 381 查看
OJ题目:click here~~

题目分析:走廊的一侧是1,3……399号房间,另一侧是2,4……400号房间。从房间号s到t,房间前的走廊不重叠的可以同时搬桌子。搬一趟桌子需要10分钟,问最少需要的时间。

贪心是可以解决。详见代码注释。

AC_CODE

const int Max_N = 202;
const int inf = 1<<30;

struct Node{
int x;
int y;
Node(){}
Node(int i , int j):x(i),y(j){}
friend bool operator<(const Node &A , const Node &B){//按照起始房间号从小到大排序
return A.x < B.x;
}
}node[Max_N] ;

int n ;
int visit[Max_N];
int main()
{
int t , i , j , k ;
cin >> t ;
while(t--)
{
memset(visit , 0 , sizeof(visit));
visit[0] = 1;
cin >> n ;
for(i = 1;i<= n;i++){
scanf("%d%d",&node[i].x , &node[i].y) ;
if(node[i].x > node[i].y) swap(node[i].x , node[i].y);//都从小到大,不影响结果
if(node[i].x&1 == 0) node[i].x-- ;//精确所占用的走廊号
if(node[i].y&1) node[i].y++ ;//精确所占用的走廊号
}
sort(node + 1, node + 1 + n) ;
node[0].y = 0;
int f = 1 ;
int times = 0 ;
int pre ;
while(*min_element(visit + 1 , visit + 1 + n) != 1){//如果没有全部处理完,则继续
times++;//每次循环,多加一次
pre = 0;
for(i = 1;i <= n;i++){
if(!visit[i]&&node[i].x > node[pre].y){//如果还没有处理,且与前面一个不重叠,则可入选
pre = i;
visit[i] = 1;//标记已处理
}
}
}
cout << times*10 << endl ;
}
return 0;
}


另一种方法,计算走廊重叠的最大个数。

const int Max_N = 202;
const int inf = 1<<30;

int n ,num[2*Max_N];
int main()
{
int t , i , j , k ,a , b;
cin >> t ;
while(t--)
{
cin >> n ;
memset(num , 0 , sizeof(num)) ;
for(i = 1;i <= n;i++){
scanf("%d%d",&a ,&b) ;
if(a > b) swap(a , b) ;
if(a&1 == 0) a-- ;
if(b&1) b++ ;
for(j = a;j <= b;j++)
num[j]++;
}
printf("%d\n",(*max_element(num + 1, num + 402))*10) ;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: