Codeforces 515B

题目大意:
b个男生,g个女生,其中有bnum个男生是开心的,gnum个女生是开心的。
在第i 天第i mod b个男生会和第i mod g个女生一起吃饭,如果两人中有一个是开心的,两个人从那一天其几都会是开心的。
问能否使全部人开心?

结题思路:
首先可以知道,如果i一直增加下去,有一些组合是怎么都不可能全部开心的,而可以全部开心的组合,应该会有一个i 的最小上界。
这道题最主要的就是确定最小上界的问题,当然可以简单粗暴的100*100,复杂度也不高应该可以直接过
但是想得更细致一点,其实可以化作是一下两个序列的比对:
b 010101010 101010101
g 012345678 012345678…..
这个问题和max(n,m)mod min(n,m)的值有关。而如其值为1,此时要比对次数最多,就取得全部人开心的i的最小上界,既是2*n*m。因为此时第三个n*m是没有必要的,因为第三个n*m是第一个重复。

以下是代码:

#include "stdio.h"
#include "stdlib.h"
#include "iostream"
#include "math.h"
#include "memory.h"

using namespace std;
int n,m;
int bnum,gnum;
bool b[108];
bool g[108];

int main()
{
    memset(b,false,sizeof b);
    memset(g,false,sizeof g);
    scanf("%d %d",&n,&m);
    scanf("%d",&bnum);
    int tmp;
    for(int i=0;i<bnum;i+=1){
        scanf("%d",&tmp);
        b[tmp]=true;
    }
    scanf("%d",&gnum);
    for(int i=0;i<gnum;i+=1){
        scanf("%d",&tmp);
        g[tmp]=true;
    }
    for(int i=0;i<2*n*m;i+=1){  //关键是这个地方
        if(b[i%n]||g[i%m]){
            b[i%n]=true;
            g[i%m]=true;
        }
    }
    bool flag=true;
    for(int i=0;i<n;i+=1){
        if(!b[i]){flag=false;break;}
    }
    for(int i=0;flag&&i<m;i+=1){
        if(!g[i]){flag=false;break;}
    }
    if(flag) printf("Yes\n");
    else printf("No\n");

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值