Stones(hdu1896)优先队列

【题目大意】

      给定N个珠子,从1到N编号,然后是M个配对关系(x,y),表示珠子x和y可以相邻,要求用最少的珠子组成串,且所用珠子个数是大于或等于3的奇数,求这个最小的珠子个数的值。

 

【详细分析】

     刚开始看到题,是自己刚刚挂的一个DIY:2008“Sunline Cup”邀请赛里的第一题,大概的想了下,觉得可以转换成最小环来做,刚好自己会最小环(可以参考我的最小环相关博文,很详细)。数据量是1000,觉得Floyd算法应该可以吧,就写了,结果是超时。赛后自己百度,看了很多讲解,下面给出整理之后的详细题解。

 

对于该类题目 分析了下复杂度 可以对各个点进行一一枚举 对于每次的枚举 记录访问到该点时的深度 当下一次访问时只要将当前深度加上访问到该点的深度就能计算出总共所用去的点数 使用2个队列  以形成逐层遍历(保证了路径的不重复) 感觉很不错 每次枚举计算出的最小值可以作为下一次的阀值 从而达到了缩小规模的目的

 

 

 

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct point
{
 int x,y;
 friend bool operator<(point a,point b)
 {
  if(a.x!=b.x)
   return a.x>b.x;
  return a.y>b.y;
 }
};
int main()
{
 int m,n,i,j,k,h;
 int ans,sum;
 point cur,in;
 scanf("%d",&n);
 while(n--)
 {
  priority_queue<point>q;
  scanf("%d",&m);
  for(i=0;i<m;i++)
  {
   scanf("%d%d",&cur.x,&cur.y);
   q.push(cur);
  }
  ans=0;
  sum=0;
  while(!q.empty())
  { 
   sum++;
   cur=q.top();
   q.pop();
   if(ans<cur.x)
    ans=cur.x;
   if(sum%2==0)
    continue;
   in.x=cur.x+cur.y;
   in.y=cur.y;
   q.push(in);
  }
  printf("%d\n",ans);
 }
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值