题意:给你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; }