2020.2.18 大一寒假训练十一(set)

Problem A:NEFU743 明明的随机数

模板题。

#include<bits/stdc++.h>
using namespace std;
int n, t;
set<int> s;
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n)
    {
        //int cnt=0;
        s.clear();
        for(int i=1; i<=n; i++)
        {
            cin>>t;
            s.insert(t);
        }
        cout<<s.size()<<endl;
        set<int>::iterator it;
        for(it=s.begin(); it!=s.end(); it++)
        {
            if(it==s.begin())
                cout<<*it;
            else cout<<" "<<*it;
        }
        cout<<endl;
    }
    return 0;
}

Problem B:NEFU1684 第K小整数

去重并排序。

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
int n, k;
bool flag=0;
set<int> num;
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    while(n--)
    {
        int tmp;
        cin>>tmp;
        num.insert(tmp);
    }
    for(set<int>::iterator it=num.begin(); it!=num.end(); it++)
    {
        k--;
        if(!k)
        {
            cout<<*it<<endl;
            flag = 1;
            break;
        }
    }
    if(!flag) cout<<"NO RESULT"<<endl;
    return 0;
}

也可以不使用set,改使用unique函数,注意要先排序后去重(unique去重比较相邻)。

#include<bits/stdc++.h>
using namespace std;
int n, k, a[10010];
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=0; i<n; i++)
        cin>>a[i];
    sort(a, a+n);
    int t=unique(a, a+n)-a;
    if(k<=t) cout<<a[k-1]<<endl;
    else cout<<"NO RESULT"<<endl;
    return 0;
}

Problem C:NEFU2117 单词记忆

模板题。

#include<bits/stdc++.h>
using namespace std;
set<string> words;
int main()
{
    ios::sync_with_stdio(false);
    int n, flag;
    string str;
    cin>>n;
    while(n--)
    {
        cin>>flag;
        if(!flag)
        {
            cin>>str;
            words.insert(str);
        }
        else
        {
            cin>>str;
            if(words.count(str)) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
    }
    return 0;
}

Problem D:NEFU1680 列车调度

#include<bits/stdc++.h>
using namespace std;
int n, m;
int main()
{
    ios::sync_with_stdio(false);
    set<int> train;
    cin>>n;
    while(n--)
    {
        cin>>m;
        if(train.empty() || m>*train.rbegin())
            train.insert(m);
        else
        {
            train.erase(train.upper_bound(m));
            train.insert(m);
        }
    }
    cout<<train.size()<<endl;
    return 0;
}

Problem E:NEFU2119 相似的数集简单版

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    set<int> sj[55];
    set<int>::iterator it;
    int n, m, num, k, num1, num2;
    cin>>n;
        for(int i=1; i<=n; i++)
    {
        cin>>m;
        while(m--)
        {
            cin>>num;
            sj[i].insert(num);
        }
    }
    cin>>k;
    while(k--)
    {
        int cnt=0;
        cin>>num1>>num2;
        for(it=sj[num1].begin(); it!=sj[num1].end(); it++)
            if(sj[num2].find(*it)!=sj[num2].end()) 
                cnt++;
        int ans = sj[num1].size()+sj[num2].size();
        printf("%.2lf%%\n", 1.0*cnt/(ans-cnt)*100);
    }
    return 0;
}

Problem F:NEFU1679 NOIP 题海战

由于数据问题卡在for和while循环上了,将while(p--)改为for(int i=1; i<=p; i++)即从TLE变为AC。

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
int n, m, p, pi;
int k, typee, q, qi;
set<int> stu[1010], tiku, usetiku;
set<int>::iterator it;
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    //freopen("tmpdata.out","r",stdin);
    //freopen("data.out","w",stdout);
    //scanf("%d%d", &n, &m);
    
    for(int i=1; i<=m; i++) tiku.insert(i); // 录入题库
    for(int i=1; i<=n; i++)
    {
        //stu[i].clear();
        cin>>p;
        //scanf("%d", &p);
        //while(p--)
        for(int j=1;j<=p;j++)
        {
            cin>>pi;
            //scanf("%d", &pi);
            stu[i].insert(pi);
        }
    }
    cin>>k;
    //scanf("%d", &k);
    while(k--)
    {
        usetiku = tiku; // 维护题库
        cin>>typee>>q;
        ///scanf("%d%d", &typee, &q);
        if(typee) // Train
        {
            //while(q--)
            for(int i=1;i<=q;i++)
            {
                cin>>qi;
                //scanf("%d", &qi);
                for(it=usetiku.begin(); it!=usetiku.end(); )
                // 在题库中找训练题
                { 
                    //if(!stu[qi].count(*it)) // 有学生没做过这道题
                    if(!stu[qi].count(*it))
                        usetiku.erase(it++); // 不会作为训练用题
                    else it++;
                }
            }
        }
        else // Contest
        {
            //while(q--)
            for(int i=1;i<=q;i++)
            {
                cin>>qi;
                //scanf("%d", &qi);
                for(it=usetiku.begin(); it!=usetiku.end(); )
                // 在题库中找比赛题
                { 
                    if(stu[qi].count(*it)) // 有学生做过这道题
                        usetiku.erase(it++); // 不会作为比赛用题
                    else it++;
                }
            }
        }
        for(it=usetiku.begin(); it!=usetiku.end(); it++)
            //printf("%d ", *it);
            cout<<*it<<" ";
        cout<<endl;
        //printf("\n");
    }
    return 0;
}

Problem G:NEFU1677 指数序列

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
int n, x, maxn;
set<int> vis;
map<int, int> num;
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    while(n--)
    {
        cin>>x;
        vis.insert(x);
        maxn = max(maxn, x);
        num[x]++;
    }
    int cnt=0;
    for(set<int>::iterator it=vis.begin(); it!=vis.end(); it++)
    {
        int tmp = num[*it];
        num[*it] = tmp%2;
        if(!num[*it]) cnt++;
        int k=tmp/2;
        if(!num[*it+1] && k!=0)
        {
            vis.insert(*it+1);
            maxn = max(maxn, *it+1);
        }
        num[*it+1] += k;
    }
    cout<<maxn+1-vis.size()+cnt<<endl;
    return 0;
}
发布了58 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/baidu_41248654/article/details/104375762