POJ 1116 Library

终于TMD过了...细节真多,没有考虑全,看了人家的AC代码才修改成功.....唉...两次枚举+一个评估函数...评估函数除了分类讨论,还是TMD分类讨论....

#include
#include
#include
using namespace std;
typedef struct Shelf{
int y;
int x;
int len;
int x1,x2;
}Shelf;
typedef struct Ans
{
int x,y;
};
Shelf s[101];
int Xn,Yn,Xt,Yt,n;
bool cmp(Shelf a,Shelf b)
{
    return a.y>b.y;
}
Ans Judge(int c,int x)//第c个木板 离壁龛左侧有x距离  
{
  Ans ans={0,0};bool flag;
  int left=x,right=x+Xt;//书在x上的左右端点
  int pos_1,pos_2,t;
  for(int i=0;i=right||s[i].x+s[i].len<=left||s[i].y>=s[c].y+Yt) continue;
      if(pos_2<=left) 
      {
          if(left-pos_1=right)
      {
          if(pos_2-rightleft&&pos_2left) ans.y+=s[i].len-left;
          ans.x++;
          if(left==0) ans.x++;
      }
      else if(pos_1>left&&pos_1=right)
      {
          if(s[i].len>Xn-right) ans.y+=s[i].len+right-Xn;
          ans.x++;
          if(right==Xn) ans.x++;
      }
      else if(pos_1<=left&&pos_2>=right)
      {
          int t=min(s[i].len-Xn+right,s[i].len-left);
          ans.y+=t<0?0:t;
          ans.x++;
          if(t==s[i].len) ans.x++;
      }
      //以上移动一个木栓
      else 
      {ans.x+=2;
       ans.y+=s[i].len;
      }
  }
  return ans;
}
Ans EnumPosition(int c)//第2次枚举
{
    Ans ans={1<<21,1<<21},t;
    if(s[c].lens[c].len||2*(i+Xt-s[c].x2-s[c].x)>s[c].len
            ||s[c].x2+s[c].x-i>s[c].len||i+Xt-s[c].x1-s[c].x1>s[c].len) t.x++;
        if(t.x



你可能感兴趣的:(枚举)