hdu 1050 Moving Tables(贪心算法)

本文深入探讨了贪心算法的应用,通过实例解析了在特定条件下如何判断并实现桌子的移动,包括不可移动和可移动的多种情况。文章提供了详细的C语言代码实现,并附有清晰的注释,帮助读者理解贪心策略的执行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此题是一个与我的上篇文章  “东东的女朋友”  极为类似的算法的一道题,依然是贪心算法的应用,针对于此题,需要注意的是不可以同时移动的

情况(Impossible)的第3种,和可以移动(Possible)的情况的第二种(见下图):

下面代码及解释如下:

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int s;
int t;
}count[1000];
int flag[1000];
int cmp(const void *a ,const void *b)
{
struct node *c = (struct node *)a;
struct node *d = (struct node *)b;
return c->s - d->s;
}

int main()
{
int i,j,k,n,m,p,q,sum,e;
scanf("%d",&n);
while(n--)
{
memset(count,0,sizeof(count)); ////这2个置0还是挺重要的
memset(flag,0,sizeof(flag)); ////
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d%d",&p,&q);
if(p<q) ////要注意
{
count[i].s=p;
count[i].t=q;
}
else
{
count[i].s=q;
count[i].t=p;
}
}
qsort(count,m,sizeof(count[0]),cmp);////
e=count[0].t;
sum=1; ////sum 记的是不同时移动的次数
flag[0]=1;
i=1; //// 下标为i的是循环中判断的
j=1; //// j 为判断过的个数
while(i<m&&j<m)
{
if(flag[i]==0&&count[i].s>e+1) ////能同时移动桌子的情况 1
{
flag[i]=1;
e=count[i].t;
j++;
}
else if(flag[i]==0&&count[i].s==e+1&&e%2==0) ////能同时移动桌子的情况 2
{
flag[i]=1;
e=count[i].t;
j++;
}
if(i==m-1&&j<m)
{
for(k=0;k<m;k++)
{
if(flag[k]==0)
{
i=k;
flag[i]=1;
e=count[i].t;
sum++;
j++;
break;
}
}
}
i++;
}
printf("%d\n",sum*10);
}
return 0;
}



转载于:https://www.cnblogs.com/world-ding/articles/2280342.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值