算法完全转载。。。原博客(https://blog.csdn.net/u014800748/article/details/38407087)
题目简单叙述
题目就是一堆学生他们有清醒的时候和昏迷的时候,并且这些都是成为了一个周期,他们还必须当其他昏迷的人大于等于清醒的人的时候才会睡觉要不就再来一个清醒的周期,最初会输入此时存在于周期的哪一个位置。
做法(完全按照原博客)
首先我们寻找一个较大的数我原本寻找的是1e6,最后又发现5e3也行,罚时瞬间从几十ms降到了0.这个数是用来计算总共要模拟的时间。然后每次都是判断当前状态的c[i]是不是已经在清醒阶段,如果是那么清醒人数加1,然后再判断c[i]是不是已经在总周期末尾或者c[i]在清醒周期末尾外加判断人数这里用了 【清醒的人数>=总人数-清醒的人数】?这样的表达来表示是不是清醒的人数多,实在是太厉害了。
我的代码(算法完全借鉴别人我现在18/10/4 11:53 vj这个题fastest第一)
#include <iostream>
using namespace std;
int a[20],b[20],c[20];
main()
{int w=0;int n;while(cin>>n&&n){for(int i=0;i<n;i++)cin>>a[i]>>b[i]>>c[i];int an;for(int i=1;i<=5e3;i++){int q=0;for(int i=0;i<n;i++)if(c[i]<=a[i])q++;if(q==n){an=i;break;}for(int i=0;i<n;i++){if(c[i]==a[i]+b[i]||c[i]==a[i]&&q>=n-q)c[i]=0;c[i]++;}if(i==5e3)an=-1;}printf("Case %d: %d\n",++w,an); }
}