Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
大家帮帮忙,我有一组数据过不去,能帮忙查下程序不?我用特殊方法把那组数据AC了。。这组数据是 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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator