zoukankan      html  css  js  c++  java
  • 2057The Lost House

    大神的指导,加上大神的题解文档,我自己照着他的代码打了一遍,通过了

    详细看看网站http://blog.sina.com.cn/s/blog_5f5353cc0100hd08.html

    我的ACCEPT代码,想通了就感觉个之前做过的一道聚会的树形dp有点像

    #include "iostream"
    #include "algorithm"
    #include "string.h"
    #include <iomanip>
    #define M 1015
    using namespace std;
    int tree[M][M],leave[M],success[M],fail[M];
    char h[M];
    
    int cmp(int u,int v) {
          return (fail[u]+2)*leave[v]<(fail[v]+2)*leave[u];
    }
    
    void work(int a){
      int i,j,tem[M];
      if(tree[a][0]==0){
        leave[a]=1;
        success[a]=0;
        fail[a]=0;
      }
      for(i=1;i<=tree[a][0];i++){
        work(tree[a][i]);
      }
      for(i=1;i<=tree[a][0];i++){
        if(h[a]=='N')fail[a]+=fail[tree[a][i]]+2;
        leave[a]+=leave[tree[a][i]];
      }
      for(i=1;i<=tree[a][0];i++){
        tem[i]=tree[a][i];
      }
      sort(tem+1,tem+tree[a][0]+1,cmp);
      for(i=1,j=0;i<=tree[a][0];i++){
        success[a]+=(j+1)*leave[tem[i]]+success[tem[i]];
        j+=fail[tem[i]]+2;
      }
    }
    
    int main(){
      char b;
      int a,n,i;
      while(cin>>n&&n){
        memset(tree,0,sizeof(tree));
        memset(success,0,sizeof(success));
        memset(fail,0,sizeof(fail));
        memset(leave,0,sizeof(leave));
        for(i=1;i<=n;i++){
          cin>>a>>b;
          if(a!=-1){
            tree[a][0]++;
            tree[a][tree[a][0]]=i;
          }
          h[i]=b;
        }
        work(1);
        double tem=(double)success[1]/(double)leave[1];
        cout <<setiosflags(ios::fixed);
        cout<< setprecision(4)<<tem<<endl;
      }
    }
  • 相关阅读:
    ssh 远程命令
    POJ 2287
    POJ 2376
    hihoCoder1488
    POJ1854
    HDU 5510
    HDU 4352
    CodeForces 55D
    HDU 1517
    CodeForces 1200F
  • 原文地址:https://www.cnblogs.com/dowson/p/3331769.html
Copyright © 2011-2022 走看看