1063セットの類似性(25point(S))のアイデアの2つのブラシ*セットを必要とし、我々は注意を払う必要があります

基本的な考え方:

その使用方法は、直接記録を設定するには、直接2つのトラバースを追加するにはあまりにも厄介ですが、それは価値のサンプルコードを学んでいます。

 

キーポイント:

セット組合交差点に考えたのは、SET、直接第二トラバースの数の直接のレコードを持つことができます。

 

最初set.findを使用する場合、+1交差点直接記録同じ要素番号を見つけ、異なる要素、+1要素の交点を見つけます。

 

二重電荷(int型 A、INT B){
     ダブル JN = 0、BN = 0 ; 
    BN = VEC [A] .size();
     のための(自動IT VEC = [B] .begin(); IT VEC = [B! ] .END(); IT ++ ){
         IF(VEC [A] .find(IT *)=!VEC [A] .END()){
             // 同じ要素を見つけた場合、 
            JN ++ ; 
        } 
        { 
            BN ++ ; 
        } 
    } 
    戻り JN / BNを; 
}

 

 

全体のコード:

#include <iostreamの> 
する#include <STDLIB.H> 
する#include <stdio.hに> 
する#include <ベクトル>  
の#include < ストリング > 
の#include <math.h>の
書式#include <アルゴリズム> 
の#include <CStringの> 
する#include <地図> 
書式#include <キュー> 
の#include < セット >
 使用して 名前空間はstdを、

整数N、M。
ベクトル < セット < int型 >> VEC。

二重電荷(int型 A、= JN 0、BN = 0 ; 
    BN = VEC [A] .size();
     のための(自動IT VEC = [B] .begin(); IT VEC = [B] .END();! IT ++ ){
         IF( VEC [A] .find(IT *)=!VEC [A] .END()){
             // 同じ要素を見つけた場合は、 
            JN ++ ; 
        } 
        { 
            BN ++ ; 
        } 
    } 
    返す JN / BNを; 
} 

int型(メイン) { 
    scanfの(" %のD "、およびN-);
     int型A、B、
     のためにint型私は= 0をI <N; I ++ ){
         セット < INT > S。
        scanf関数(" %のD "、& )。
        INT J = 0 ; J <; J ++ ){ 
            scanf関数(" %のD "、&B)。
            s.insert(B)。
        } 
        vec.push_back(S); 
    } 
    のscanf(" %dの"、&M)。
    以下のためにINT iが= 0 ; I <M、I ++){
        scanf関数(" %D%D "、&​​、&B)。
        二重再=電荷( - 1、B - 1)* 100 // coutの<<再<<てendl; 
        printf(" %.1lf %% \ n " 、RE)。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/songlinxuan/p/12340726.html