题目:
这个题目最重要的是要明白,不管是二维码通道还是非二维码通道,二者都是同时进行的,而时间的最小值一定是3(才能保证至少能完成非二维码人群的检测)。
这个题目我的思路是用两层循环,时间作为第一层循环,非二维码组数作为第二层循环,运用break语句,就可以达到,满足条件后跳出循环,在时间最少,二维码组数最多的情况下,完成检测。
代码
#include<stdio.h>
#define N 10
#include<math.h>
int passway(int n,int n1,int *pn);
int main()
{
int n,n1,pn1;
int time;
scanf("%d %d",&n,&n1);
time=passway(n,n1,&pn1);
if(time>0)
printf("%d %d %d",pn1,N-pn1,time);
else
printf("error!");
}
int passway(int n,int n1,int *pn)
{
int time,N1,n2,N2;//N1指的是在限定时间和二维码通道数情况下,能做多少个有二维码的人,N2同理
int y;
n2=n-n1;
if(n<0||n1>=n||n2>=n)//题目中已经说明下列情况要输出error,但是主函数中是time<0 才输出出error,所以给time赋值<0即可
{
time=-1;
return time;
}
else
{
for(time=3;;time++)
{if(N1>=n1&&N2>=n2) //这个的话是为了跳出第一层循环,只要保证人数能做完,跳出循环,就能满足条件
break;
for(y=1;y<=9;y++) //让y作为变量是为了保证同等时间下,二维码通道数最多
{
N1=(10-y)*time;
N2=y*time/3;
if(N1>=n1&&N2>=n2) //这个的话是为了跳出第二个循环,
{
*pn=10-y;
break;
}
}
}
return time-1; //由于第二个循环中的break,只能跳出第二个循环,第一个循环又执行了一遍time++,所以要减掉一
}
}