PTA L1-020友達がいないにはハンサムすぎる(C ++離散化ソリューション)

Ben Mengxinは離散化を行うことを学んだばかりで、以前にカウントと並べ替えで行った質問を思い出しました。
Ben Mengxinは、離散化を使用して解決する準備ができています
(何もしません)

離散化を使用する理由

1問題の数値範囲が大きくない場合、カウントソートを使用できません
。2使用するスペースが多い
ため、このばか0.0を解決するために離散化を使用することにしました。

問題

すべての生き物がモーメントに写真を投稿するのに忙しいとき、彼らはハンサムすぎるために友達がいない人が常にいます。この質問では、友達がいないほどハンサムな人を見つける必要があります。

入力形式:入力の
最初の行は、既知のモーメントの数である正の整数N(≤100)を示します。後続のN行は、最初に各行がモーメントの数である正の整数K(≤1000)を示します。人数を入力し、友達の輪にすべての人をリストします-便宜上、各人は5桁の番号(00000から99999)であるID番号に対応し、IDはスペースで区切られます;正の整数M(≤10000)は、照会される人数です。照会されるM IDは、スペースで区切られた次の行にリストされています。

注:友達がいない人は、「友達の輪」をまったくインストールしていない人でも、友達の輪の中に一人でいる人でもかまいません。友達のサークルに繰り返し自分自身を追加する個々のナルシシストがいますが、タイトルは、Kが1を超えるすべてのサークルに少なくとも2人の異なる人々がいることを保証します。

出力形式:
ハンサムすぎて友達がいない人を入力順に出力します。IDはスペースで区切られ、行の最初と最後に余分なスペースがあってはなりません。ハンサムすぎる人がいない場合は、出力誰もハンサムではありません。

注:同じ人物に複数回クエリを実行できますが、出力は1回のみです。

入力例1:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
出力例1:
10000 88888 23333
入力例2:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
出力サンプル2:
誰もハンサムで、善良で、ナンセンスではありません。
コードに移動してください

#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
using namespace std;
typedef pair<int,int> PII;
vector<int> alls,dev;
vector<PII> segs;
const int N=1e5;
int a[N];
int n,m;
int find(int x){
    
    
    int l=0,r=alls.size()-1;
    while(l<r){
    
    
        int mid=r+l>>1;
        if(alls[mid]>=x) r=mid;
        else l=mid+1;
    }
    return r;
}
int main(){
    
    
    cin>>n;
    while(n--){
    
    
        int T;
        cin>>T;
        for(int i=0;i<T;i++){
    
    
            int x;
            cin>>x;
            alls.push_back(x);
            if(T<=1) break;
            segs.push_back({
    
    x,1});
        }
    }
    cin>>m;
    while(m--){
    
    
        int x;
        cin>>x;
        alls.push_back(x);
        dev.push_back(x);
    }
    sort(alls.begin(),alls.end());
    alls.erase(unique(alls.begin(),alls.end()),alls.end());
    for(auto seg:segs){
    
    
        int x=find(seg.first);
        a[x]+=seg.second;
    }
    int k=0;
    for(auto item:dev){
    
    
        int y=find(item);
        if(!a[y]){
    
    
            if(k) cout<<" ";
            printf("%05d",item);
            a[y]++;
            k++;
        }
    }
    if(!k) cout<<"No one is handsome"<<endl;
    return 0;
}

この質問は、離散化を使用して新しい学習アルゴリズム(私のような)を
支援します0.0この質問は、離散化の簡単な練習として使用できます。
ご支援いただきありがとうございます

おすすめ

転載: blog.csdn.net/m0_52361859/article/details/112239083