Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)

本文记录了作者参加CF(Codeforces)竞赛的经历,包括赛中心态调整及三道题目的解题思路。题目涉及寻找最小公共元素、求最大值与最小值以及素数筛选等算法问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cf掉分记,掉掉掉

又单挑了一场acm训练赛,偶然发现有一场时间很棒的cf,疲劳做题不可取啊,但还是抑制不住自己内心的欲望,打就打吧,大不了掉分,怕啥


A. Search for Pretty Integers

思路:找最小公共元素,若没有,则依次找各数组最小值,确实还是有点迟钝了,水题写了十几分钟

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e5+10;

bool a[10],b[10],c[10];

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(a,false,sizeof(a));
        memset(b,false,sizeof(b));
        memset(c,false,sizeof(c));
        for(int i=0;i<n;i++)
        {
            int temp;
            scanf("%d",&temp);
            a[temp] = true;
        }
        for(int i=0;i<m;i++)
        {
            int temp;
            scanf("%d",&temp);
            b[temp] = true;
            if(a[temp])
            {
                c[temp] = true;
            }
        }
        bool ok = false;
        for(int i=1;i<=9;i++)
        {
            if(c[i])
            {
                printf("%d\n",i);
                ok = true;
                break;
            }
        }
        if(!ok)
        {
            int aa,bb;
            for(int i=1;i<=9;i++)
            {
                if(a[i])
                {
                    aa = i;
                    break;
                }
            }
            for(int i=1;i<=9;i++)
            {
                if(b[i])
                {
                    bb = i;
                    break;
                }
            }
            if(aa<bb)
            {
                int tempc = aa;
                aa = bb;
                bb = tempc;
            }
            printf("%d\n",aa+bb*10);
        }
    }
    return 0;
}



B. Maximum of Maximums of Minimums

思路:这个签到题有点迟钝了,就分三种情况

m=1,求最小值

m=2,求边缘最大值

m>=3,求最大值

简单明了,连特殊情况都不用考虑

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e5+10;

int a[maxn];

int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        int maxa = -2e9;
        int mina = 2e9;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i] > maxa)
            {
                maxa = a[i];
            }
            if(a[i] < mina)
            {
                mina = a[i];
            }
        }
        if(k>=3)
        {
            printf("%d\n",maxa);
        }
        else if(k==1)
        {
            printf("%d\n",mina);
        }
        else
        {
            printf("%d\n",max(a[0],a[n-1]));
        }
    }
    return 0;
}


C. Maximum splitting

思路:这题一开始想了好久数论,后来发现数据量太大,并不能实现,还是太累了,都快写睡着了

算了还是老老实实素数筛找规律吧

至于合数的写法,搞了好久,其实各种写法都能实现,只是时间效率的问题,既然都是打表,就没啥了

最后由于数组越界WA了一发,终场前压哨交了一发,还好终审过了,惊心动魄,赶紧休息吧

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e5+10;

bool visit[maxn];

vector <int> prime;//素数
vector <int> prime2;
vector <int> tempprime;
vector <int> nexprime;

void getPrime(int n)
{
    memset(visit,false,sizeof(visit));
    prime.clear();
    for(int i=2;i<n;i++)
    {
        if(!visit[i])
        {
            prime.push_back(i);
        }
        for(int j=0;j<(int)(prime.size())&&i*prime[j]<n;j++)
        {
            visit[i*prime[j]] = true;
            if(i%prime[j]==0)
            {
                break;
            }
        }
    }
}

/*void getprime2(int n)
{
    getPrime(n);
    int len = prime.size();
    //cout << len << endl;
    prime2.clear();
    for(int i=0;i<len;i++)
    {
        for(int j=0;prime[i]*prime[j]<=n;j++)
        {
            prime2.push_back(prime[i]*prime[j]);
        }
    }
}*/

void getprime2(int n)
{
    getPrime(n);
    int len = prime.size();
    //cout << len << endl;
    prime2.clear();
    int pos = 0;
    for(int i=4;i<=n;i++)
    {
        while(i>prime[pos]&&pos<len)
        {
            pos++;
        }
        if((i<prime[pos])||(pos==len))
       {
           prime2.push_back(i);
       }
    }
}

const int N = 500;

int re[N+10];

int main()
{
    int q;
    //freopen("standard.txt","w",stdout);
    getprime2(N);
    tempprime = prime2;
    int len = prime2.size();
    int slen = tempprime.size();
    memset(re,-1,sizeof(re));
    int num = 0;
    while(slen)
    {
        num++;
        for(int i=0;i<slen;i++)
        {
            if(re[tempprime[i]]<num)
            {
                re[tempprime[i]] = num;
            }
        }
        nexprime.clear();
        for(int i=0;i<len;i++)
        {
            for(int j=0;j<slen&&prime2[i]+tempprime[j]<=N;j++)
            {
                nexprime.push_back(prime2[i]+tempprime[j]);
            }
        }
        tempprime = nexprime;
        slen = tempprime.size();
    }
    /*for(int n=0;n<=200;n++)
    {*/
    for(int i=0;i<=N;i++)
    {
        cout << re[i] << endl;
    }
    /*while(scanf("%d",&q)!=EOF)
    {
        while(q--)
        {
            int n;
            scanf("%d",&n);
            if(n<=20)
            {
                printf("%d\n",re[n]);
            }
            else
            {
                int base = n/4;
                if(n%2==1)
                {
                    base--;
                }
                printf("%d\n",base);
            }
        }
    }*/
    return 0;
}


cf明天还有一场,估计那场打完,估计短时间内就不会再打了

ccsp,加油咯

文章地址:http://blog.youkuaiyun.com/owen_q/article/details/78245413

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值