您的位置:首页 > 其它

算法竞赛入门经典(第二版)-刘汝佳-第四章 函数与递归 特别困的学生 (特困生)

2016-08-03 15:19 274 查看
http://acm.hust.edu.cn/vjudge/contest/123676#problem/N  密码 5201





#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
#include<iostream>
using namespace std;
int stu[15][11000];
int n;
// 1醒 -1睡
int num_0(int t)
{
int i,ret(0);
for(i=0;i<n;i++) if( stu[i][t]==0 ) ret++;
return ret;
}
int sleep(int t)
{
int ret(0),i;
for(i=0;i<n;i++)
{
if(stu[i][t]==-1) ret++;
}
if(ret>n-ret) return -1;
return 1;
}
int isok(int t)
{
int i,ret(0);
for(i=0;i<n;i++)
{
if(stu[i][t]==-1) ret++;
}
if(ret==0) return 1;
return 0;
}
int main()
{
//freopen("C:\\Users\\5201\\Desktop\\1.txt","r",stdin);
//freopen("C:\\Users\\5201\\Desktop\\yb.txt","w",stdout);
int casetime(1);

while(cin>>n,n)
{
memset(stu,0,sizeof(stu));
printf("Case %d: ",casetime++);
int i,j;
int a[15]={},b[15]={},c[15]={};
for(i=0;i<n;i++)
{
cin>>a[i]>>b[i]>>c[i];
j=0;
if(c[i]<=a[i])
{
for(j;j<a[i]-c[i]+1;j++) stu[i][j]=1;//醒
for(int k=0;k<b[i];j++,k++) stu[i][j]=-1;//睡
for(int k=0;k<a[i];j++,k++) stu[i][j]=1;
}
else
{
for(j=0;j<a[i]+b[i]-c[i]+1;j++) stu[i][j]=-1;
for(int k=0;k<a[i];j++,k++) stu[i][j]=1;
}
}
int ans(0);
for(ans;ans<10000;ans++)
{
if(isok(ans))
{
printf("%d\n",ans+1);
break;
}
if(num_0(ans))
{
for(i=0;i<n;i++)
{
if(stu[i][ans]==0)
{
int t=sleep(ans-1);
if(t==1)
{
for(j=0;j<a[i];j++) stu[i][ans+j]=1;
}
else
{
for(j=0;j<b[i];j++) stu[i][ans+j]=-1;
for(int k(0);k<a[i];k++,j++) stu[i][ans+j]=1;
}
}
}
}
}
if(ans>=10000) printf("-1\n");
}
return 0;
}

ps

1.简单模拟。

2.对于-1 模拟1w次 超过就是-1   无严谨证明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐