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

来源:互联网 发布:网络接口转换器怎么用 编辑:程序博客网 时间:2024/04/28 12:22

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   无严谨证明

0 0
原创粉丝点击