CodeForces Aline Sunset

题意:给你n个自转周期和日出日落不同的星球,以周期最大的星球的时间为基准,计算在1825天之内有没有时间点这几颗星球同时处于黑夜,如果有,输出第一次集体处于黑夜的时间(大于自转周期最大的星球的自传时间也可!!!),否则输出“impossible”。

思路:星球分为两种情况:
一种是:日出时间L大于日落时间R,这样的星球黑夜处于[R,L]之间。
另一种是:日出时间L小于日落时间R,这样的星球黑夜处于[0,L]and[R,N],(N为自转周期)。
这样从0~ManN*1825之间
遍历时间查找一个时刻下两种情况的星球同时处于黑夜的时间即可。

#include<iostream>
#include<cstring>
#include<set>
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
    int h;
    int l;
    int r;
    int Case;
    int day;
}s[25];
int main()
{
    int n;
    scanf("%d",&n);
    int Max=-1;
    int Min=inf;
    for(int i=0;i<n;i++)
    {
        scanf("%d %d %d",&s[i].h,&s[i].l,&s[i].r);
        if(s[i].h>=Max)
            Max=s[i].h;
        if(s[i].l<s[i].r)
        {
            s[i].Case=1;
        }
        else
        {
            s[i].Case=2;
        }
    }
    int d=Max;
    Max=Max*1825;
    set<int>P;
    int flag=0,k;
    for(int i=0;i<Max;i++)
    {   P.clear();
        for(int j=0;j<n;j++)
        {
            int m=i%s[j].h;
            if(s[j].Case==1)
            {
                if(m>=0&&m<=s[j].l||m>=s[j].r&&m<=s[j].h){
                   s[j].day=1;
                P.insert(s[j].day);}
                else
                {
                    s[j].day=2;
                    P.insert(s[j].day);
                }
            }
            if(s[j].Case==2)
            {
                if(m<=s[j].l&&m>=s[j].r){
                    s[j].day=1;
                P.insert(s[j].day);}
                else
                {
                    s[j].day=2;
                    P.insert(s[j].day);
                }
            }
        }
        if(P.size()==1&&*P.begin()==1)
        {
            flag=1;
            k=i;
            break;
        }
    }
    if(flag==0)
        printf("impossible\n");
    else if(flag==1)
        printf("%d\n",k);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a17865569022/article/details/80181906
今日推荐