zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 89 (Rated for Div. 2) A D 题

    复工第一场CF,给我整的很难受

    Educational Codeforces Round 89 (Rated for Div. 2)

    A题

    题意

    T组输入,每组给出两个数字 $a $, (b) ,分别表示两种原材料的数量,使用 1 个 (a) 和 2 个 (b) 可以制造玩具 A , 使用 2 个 (b) 和 1 个 (a) 可以制造玩具 B ,每个玩具都可以卖 1 元,问最多可以赚多少钱?

    思路

    我们假设 a < b。

    想来想去还是用的高中学的不等式的方法,设玩具 A 制造了 (x) 个,玩具 B 制造了 (y) 个,列不等式:

    [y<=-frac{1}{2} x+frac{a}{2}\y<=-2x+b ]

    (y=-x+z)(z) 的最大值。

    如果(2*a<=b) 那么在((a,0))处取的最大值,否则在两直线交点((frac{2*b-a}{3},相应的y))处取得最大值。

    第二种情况求出交点横坐标 (x) 之后,在求纵坐标 (y) 时,注意不能直接代入直线,因为横坐标(x)

    可能是经过取整的,所以代入可能会不再直线上,要通过两个不等式求最大的 (y)

    代码

    #include<bits/stdc++.h>
    #define pb push_back
    const int N=1e5+10;
    const int inf=0x3f3f3f3f;
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    int a,b;
    int get(int x)
    {
        int m=b-2*x;
        int n=(a-x)/2;
        return min(m,n);
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&a,&b);
            if(a>b) swap(a,b);
            if(a*2<=b) printf("%d
    ",a);
            else
            {
                int x=(2*b-a)/3;
                printf("%d
    ",x+get(x));
            }
        }
        return 0;
    }
    

    D题

    题意

    给出 (n) 个数字,对于每个数字 (x) 求出两个数字 (d_1,d_2) ,满足(gcd(d_1+d_2,x)==1),(x\%d_1==0),(x\%d_2==0)。如果不存在输出两个 -1 。

    思路

    (x) 进行质因数分解后:(x=p_1^{k_1}*p_2^{k_2}*···*p_{n-1}^{k_n-1}*p_n^{k_n})

    (d_1=p_1^{k_1},d_2=x/d_1)

    此时满足:

    ((d_1+d_2)\%p_1!=0)

    ((d_1+d_2)\%p_2!=0)

    ......

    ((d_1+d_2)\%p_n!=0)

    所以我们只需求出 (x) 的最小的质因数,使用欧拉筛素数。

    代码

    #include<bits/stdc++.h>
    #define pb push_back
    using namespace std;
    const int N=5e5+10;
    const int inf=0x3f3f3f3f;
    typedef long long ll;
    typedef unsigned long long ull;
    
    int arr[N],a[N],b[N];
    int vis[N*20],pri[N*20],tot;
    void solve(int n)
    {
        for(int i=2; i<=n; i++)
        {
            if(!vis[i])
                pri[++tot]=i;
            for(int j=1; j<=tot; j++)
            {
                if(i*pri[j]>n)
                    break;
                vis[i*pri[j]]=pri[j];//纪录最小的素因子
                if(i%pri[j]==0)
                    break;
            }
        }
    }
    
    int main()
    {
        solve(N*20);
        int n;
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            int x;
            scanf("%d",&x);
            if(!vis[x])
                a[i]=b[i]=-1;
            else
            {
                int num=1;
                int tmp=vis[x];
                while(x%tmp==0)
                {
                    num*=tmp;
                    x/=tmp;
                }
                if(x==1)
                    a[i]=b[i]=-1;
                else
                {
                    a[i]=x;
                    b[i]=num;
                }
            }
        }
        for(int i=1; i<=n; i++)
            printf("%d ",a[i]);
        printf("
    ");
        for(int i=1; i<=n; i++)
            printf("%d ",b[i]);
        printf("
    ");
        return 0;
    }
    
  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/valk3/p/13284034.html
Copyright © 2011-2022 走看看