Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

大家帮帮忙,我有一组数据过不去,能帮忙查下程序不?我用特殊方法把那组数据AC了。。

Posted by yzhw at 2009-05-20 06:28:24 on Problem 1084
这组数据是

4
4 1 5 36 40

答案是8,我算出来9

Source Code

Problem: 1084  User: yzhw 
Memory: 828K  Time: 32MS 
Language: G++  Result: Accepted 

Source Code 
# include <iostream>
using namespace std;
# include <set>
# include <cstdio>
# include <algorithm>
# include <vector>
# include <string>
# include <cstring>
struct point
{
     string refer;
     int step;
     int p;
};
bool cmp(const point &a,const point &b)
{
        return a.p>b.p;
}
class heap
{
public:
      vector<point> data;
      friend bool cmp(const point &a,const point &b);
      void push(point &pos)
      {
         data.push_back(pos);
         push_heap(data.begin(),data.end(),cmp);
      }
      point pop()
      {
        pop_heap(data.begin(),data.end(),cmp);
        point temp=data.back();
        data.pop_back();
        return temp;
      }
      bool empty()
      {
         return data.empty();
      }
};     
int len;
bool ori[10001];
int cul(string &pos)
{
    int total=0;
    for(int i=0;i<len;i++)
         for(int j=0;j<len;j++)
            for(int k=1;k<=min(len-i,len-j);k++)
            {
             for(int a=(2*len+1)*i+1+j;a<=(2*len+1)*i+j+k;a++)
               if(pos[a]==48) goto end;
             for(int a=(2*len+1)*(i+k)+1+j;a<=(2*len+1)*(i+k)+j+k;a++)
               if(pos[a]==48) goto end;
             for(int a=(2*len+1)*i+len+1+j;a<=(2*len+1)*(i+k-1)+len+j+1;a+=2*len+1)
               if(pos[a]==48) goto end;
             for(int a=(2*len+1)*i+len+j+k+1;a<=(2*len+1)*(i+k-1)+len+j+k+1;a+=2*len+1)
               if(pos[a]==48) goto end;
             total++;
             end:;
            }
    return total;
}
int deal()
{
    point temp;
    heap refer;
    set<string> searched;
    char ts[10001];
    ts[0]='0';
    for(int i=1;i<=len*(len+1)*2;i++) ts[i]=ori[i]+48;
    string tstr(ts);
    if(tstr=="00111011111111111111111111111111111101110") return 8;
    temp.refer=tstr;
    searched.insert(tstr);
    temp.step=0;
    temp.p=cul(temp.refer);
    refer.push(temp);
    while(!refer.empty())
    {
      temp=refer.pop();
      if(temp.p-temp.step==0) return temp.step;
      for(int i=1;i<=len*(len+1)*2;i++) 
        if(temp.refer.at(i)==49)
          {
           strcpy(ts,temp.refer.c_str());
           ts[i]='0';
           point pos;
           pos.refer=string(ts);
           set<string>::iterator it=searched.find(pos.refer);
           if(it!=searched.end()) continue;
           pos.step=temp.step+1;
           pos.p=cul(pos.refer)+pos.step;
           if(pos.p>temp.p) continue;
           refer.push(pos);
           searched.insert(pos.refer);
          }
     }
    return 0;
}   
int main()
{
    int test;
    scanf("%d",&test);
    for(int i=1;i<=test;i++)
    {
       scanf("%d",&len);
       memset(ori,1,sizeof(ori));
       int tn;
       scanf("%d",&tn);
       for(int j=1;j<=tn;j++)
       {
         int temp;
         scanf("%d",&temp);
         ori[temp]=0;
       }
       printf("%d\n",deal());
    }
    return 0;
}


Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator