google codejam 2008 round2

来源:互联网 发布:java中间件框架 编辑:程序博客网 时间:2024/05/20 23:32

Problem A. Cheating a Boolean Tree

模拟题,可将dfs的结果保存到数组进行优化


 #pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <stdio.h>#include <fstream>#include <iomanip>#include <cmath>#include <string>#include <string.h>#include <sstream>#include <cctype>#include <climits>#include <set>#include <map>#include <deque>#include <queue>#include <vector>#include <iterator>#include <algorithm>#include <stack>#define _clr(x,y) memset(x,y,sizeof(x))#define _inf(x) memset(x,0x3f,sizeof(x))#define pb push_back#define mp make_pairusing namespace std;const int INF = 0x3f3f3f3f;const double eps = 1e-8;typedef long long LL;struct node{int g,c,val;}tree[10000+5];int m;int dfs(int x,int v){int res=INF,res2=INF;if(x>(m-1)/2) if(v==tree[x].val) return 0;else return INF;int l1,l0,r1,r0;l1=dfs(x*2,1);l0=dfs(x*2,0);r1=dfs(x*2+1,1);r0=dfs(x*2+1,0);if(tree[x].g==1){if(v==1){res=l1+r1;}else{res=min(l1+r0,r1+l0);res=min(res,r0+l0);}}else{if(v==0){res=l0+r0;}else{res=min(l1+r0,r1+l0);res=min(res,r1+l1);}}if(tree[x].c==1){if(tree[x].g==0){if(v==1){res2=l1+r1;}else{res2=min(l1+r0,r1+l0);res2=min(res2,r0+l0);}}else{if(v==0){res2=l0+r0;}else{res2=min(l1+r0,r1+l0);res2=min(res2,r1+l1);}}}res=min(res,res2+1);if(res>=INF) res=INF;//cout<<x<<" "<<v<<" "<<res<<endl;return res;}int main(){//ios_base::sync_with_stdio(false);cin.tie(0);#ifndef ONLINE_JUDGE//freopen("A-small-practice.in","r",stdin);//freopen("out.txt","w",stdout);#endifint T;cin>>T;for(int cas=1;cas<=T;cas++){_clr(tree,0);        int v;        cin>>m>>v;        for(int i=1;i<=(m-1)/2;i++)        {        cin>>tree[i].g>>tree[i].c;}for(int i=(m-1)/2+1;i<=m;i++)        {        cin>>tree[i].val;}int ans=dfs(1,v);cout<<"Case #"<<cas<<": ";if(ans==INF) cout<<"IMPOSSIBLE"<<endl;else cout<<ans<<endl;}    return 0;}


0 0
原创粉丝点击