PAT真题(C语言)——1014:Waiting in Line

PAT真题(C语言)——1014:Waiting in Line_第1张图片
这道题我找到了解决的方法,可是不得不说,写出来的代码真的是丑陋无比,各种数组嵌套嵌套,很容易就把自己套晕了,果然不能乱套娃……
直接说一下解决思路吧。
客人分两种:黄线满之前来的和黄线满之后来的。
对于黄线满之前来的,只需要判断哪一列人最少就直接把他放到那一列就行了。
对于黄线满之后的,我想到了一个方法:假如每一列黄线内最多排M个人,那么只要去判断每一列的倒数第M个人谁先服务完就分配他到哪一列。要实现这个目标,就需要统计每一列每个人的服务结束时间,再按这个方法判断即可。
直接上代码吧,我估计大家看了也恶心,但是我还是要恬不知耻的放上来

#include 
#include 

int out[20];

int ptime(int t)
{
	int m, s;
    if(t==999999)
    {
        printf("Sorry\n");
        return 0;
    }
	m = t / 60;
	s = t % 60;
	printf("%02d:%02d\n", m + 8, s);
	return 0;
}

int main()
{
	int window[20][1001] = { 0 };//每一行第一个元素保存当前行人数(小于最大人数)
	int wait[1000] = { 0 };
	int check[1000] = { 0 };
    int time[1000];
	int full = 0;
	int N, M, K, Q;
	int minWin[2];//[最短窗口号,人数/时间]

	scanf("%d %d %d %d", &N, &M, &K, &Q);

	for (int i = 0; i<K; i++)
		scanf("%d", &wait[i]);

	for (int i = 0; i<Q; i++)
		scanf("%d", &check[i]);

	for (int i = 0; i<K;)
	{
		minWin[0] = -1;
		minWin[1] = 99999999;

		if (full == 1)
		{
			for (int j = 0; j<N; j++)
			{
				if (window[j][window[j][0] - M + 1] < minWin[1])
				{
					minWin[0] = j;
					minWin[1] = window[j][window[j][0] - M + 1];
				}
			}

			window[minWin[0]][0]++;

            if(window[minWin[0]][window[minWin[0]][0]-1]>=540)
                window[minWin[0]][window[minWin[0]][0]] = 999999;
            else
			    window[minWin[0]][window[minWin[0]][0]] = wait[i] + window[minWin[0]][window[minWin[0]][0]-1];

            time[i] = window[minWin[0]][window[minWin[0]][0]];
		}
		else 
		{
			for (int j = 0; j<N; j++)
			{
				if (window[j][0]<minWin[1])
				{
					minWin[0] = j;
					minWin[1] = window[j][0];
				}
			}
			if (minWin[1] >= M)
			{
				full = 1;
				continue;
			}
			minWin[1]++;
			window[minWin[0]][0]++;
			if (window[minWin[0]][0] == 1)
			{
				window[minWin[0]][1] = wait[i];
                time[i] = wait[i];
			}
			else
			{
                if(window[minWin[0]][minWin[1]-1]>=540)
                    window[minWin[0]][minWin[1]] = 999999;
                else
				    window[minWin[0]][minWin[1]] = wait[i] + window[minWin[0]][minWin[1]-1];
                    
                time[i] = window[minWin[0]][minWin[1]];
			}

		}
		i++;
	}

    for(int i=0;i<Q;i++)
    {
        ptime(time[check[i]-1]);
    }

	return 0;
}

你可能感兴趣的:(PAT)