CodeForces 483B

题目大意:
你有两个朋友 你将对每一个朋友展示几个正整数
向第一个朋友展示 cnt1 个 向第二个朋友展示 cnt2 个
每个人的展示数唯一不重复
然而,第一个朋友不喜欢能被素数x整除的数字
第二个朋友不喜欢能被素数y整除的数字
你自然不会给你的朋友展示不喜欢的东西
你的任务是找到这样的最小数量v,你可以使用一组1,2,…,v中的数字来形成礼物
当然,您可以选择不提供一些数字。
如果大于1的正整数除了1和它本身之外没有正除数,则称为素数。

输入:
唯一的行包含四个正整数cnt1,cnt2,x,y(1≤cnt1,cnt2 <10^9; cnt1 +cnt2≤10^9;2≤x ,y≤3*10^4) - 语句中描述的数字。
数字x,y保证是素数。

输出:
唯一正整数v

想法:
本来就想做两个1000*1000*1000的数组的。。但是想了想这里可能用指针比较合适(或许这个题目也很适合用栈结构),主要考虑的是动态生成数据链。


这里写图片描述



#include<iostream>
using namespace std;
void San(long long cnt1, long long cnt2, int x, int y);
struct p{
    long long num;
    struct p *next;
};
int main()
{
    long long cnt1, cnt2;
    int x, y;
    while (true)
    {
        cin >> cnt1 >> cnt2 >> x >> y;
        San(cnt1, cnt2, x, y);
    }
    return 0;
}
void San(long long cnt1, long long cnt2, int x, int y)
{
    p *p1;
    p *p2;
    p1 = new p;
    p1->num = 0;
    p1->next = NULL;
    p2 = new p;
    p2->num = 0;
    p2->next = NULL;
    if (y<x)
    {
        int z = x;
        x = y;
        y = z;
    }
    long long i = 1;
    int xflag = 0;
    int yflag = 0;
    p *p11 = p1;
    p *p22 = p2;
    while (xflag != cnt1||yflag != cnt2)
    {
        if (i%x != 0 && xflag<cnt1)
        {
            p11->num = i;
            p11->next = new p;
            p11 = p11->next;
            p11->num = 0;
            p11->next = NULL;
            xflag++;
        }
        else if (i%y == 0 && yflag<cnt2)
        {
            if (i%x == 0 || (p1->num == 0))
                ;
            else if (p1->num%y == 0)
            {
                p *temp = p1;
                p1 = p1->next;
                delete temp;
            }
            else
            {
                p22->num = p1->num;
                p22->next = new p;
                p22->num = 0;
                p22 = p22->next;
                p1->num = i;
                yflag++;
            }

        }
        else if (i%y != 0 && yflag<cnt2)
        {
            p22->num = i;
            p22->next = new p;
            p22 = p22->next;
            p22->num = 0;
            p22->next = NULL;
            yflag++;
        }
        i++;
    }
    cout << i-1 << endl;
    while (p1->next != NULL)
    {
        p *temp = p1;
        p1 = p1->next;
        delete temp;
    }
    while (p2->next != NULL)
    {
        p *temp = p2;
        p2 = p2->next;
        delete temp;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值