CodeForces - 1166E(思维)

题目链接:https://vjudge.net/contest/349801#problem/A

参考文章:https://blog.csdn.net/xs18952904/article/details/90338776

题目:

输入m,n(n表示一个序列ai,长度为n),接下来m行,每行一个si表示这行要输入的数字的个数然后si个数字,

这si个数字的LCM(选中的si个数字) > LCM(ai序列中剩余的n-si个数字)。

判断是否存在这个ai序列。

思路:

假设两个si,sj两个集合不相交,则LCM(si) > LCM(n-si),LCM(sj) > LCM(n-sj)。

但是如果LCM(si) > LCM(n-si)成立,则LCM(sj) > LCM(n-sj)一定不成立;

因为sj是n-si的子集,所以两个结论冲突。

扩展到一般情况,就是只有任意两个si都有交集,ai序列才存在。

代码:

#include <bits/stdc++.h>
using namespace std;
bool a[52][10005] = {false};
int main(void)
{
    int m,n,x,y;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&x);
        for(int j=1;j<=x;j++)
        {
            scanf("%d",&y);
            a[i][y] = true;
        }
    }
    for(int i=1;i<=m;i++)
    {
        for(int j=i+1;j<=m;j++)
        {
            bool fg = false;
            for(int k=1;k<=n;k++)
                if(a[i][k] == true && a[j][k] == true)
            {
                fg = true;break;
            }
            if(fg == false)
            {
                printf("impossible\n");
                return 0;
            }
        }
    }
    printf("possible\n");
    return 0;
}
发布了438 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/103752924
今日推荐