PAT甲級真題 1017 Queueing at Bank

一、題目
在這裏插入圖片描述
在這裏插入圖片描述

二、
還是要搞清楚思路,運用技巧
注意細節!!!

三、代碼

v1.0:

#include <stdio.h>
#include <stdlib.h>
#define START 28800
#define STOP 61200

typedef struct {
	int at; int pt;
	int st; int et;
}customer;
customer wait[10001];

typedef struct node{
	customer data;
	struct node* next;
}line;
line* h;
int vn, k, linelen, wf, wr;
float sum;

int cmp(const void* a, const void* b) {
	customer* tmpa = (customer*)a;
	customer* tmpb = (customer*)b;
	return tmpa->at - tmpb->at;
}

int process() {
	int fast, i;
	line* s, *p;
	s = h->next;
	fast = s->data.et;
	while (s != NULL) {
		if (fast > s->data.et)
			fast = s->data.et;
		s = s->next;
	}
	s = h; p = h->next;
	while (p != NULL) {
		if (p->data.et == fast) {
			sum += p->data.st - p->data.at;
			s->next = p->next;
			p = p->next;
			linelen--;
		}
		else {
			s = s->next; p = p->next;
		}
	}
	while ((wf!=wr)&&(linelen<k)) {
		s= (line*)malloc(sizeof(line));
		s->data = wait[++wf];
		if (s->data.at > fast)
			s->data.st = s->data.at;
		else
			s->data.st = fast;
		s->data.et = s->data.st + s->data.pt;
		s->next = h->next;
		h->next = s;
		linelen++;
	}
	return 0;
}

int main() {
	int n, i, tmph, tmpm, tmps, tmppt, tmpt, f=0;
	line* s;
	scanf("%d %d", &n, &k);
	for (i = 0; i < n; i++) {
		scanf("%d:%d:%d %d", &tmph, &tmpm, &tmps, &tmppt);
		tmpt = tmps + tmpm * 60 + tmph * 3600;
		if (tmpt > STOP)
			continue;
		wr++;
		wait[wr].at = tmpt; 
		if(tmppt<=60)
			wait[wr].pt = tmppt*60;
		else
			wait[wr].pt = 60 * 60;
	}
	vn = wr;
	if (vn == 0) {
		printf("0.0");
		return 0;
	}
	qsort(&wait[1], vn, sizeof(customer), cmp);//坑
	h = NULL;
	while (linelen < k) {
		if (wf == wr)
			break;
		s = (line*)malloc(sizeof(line));
		s->data = wait[++wf];
		if (s->data.at < START)
			s->data.st = START;
		else
			s->data.st = s->data.at;
		s->data.et = s->data.st + s->data.pt;
		s->next = h;
		h = s;
		linelen++;
	}
	s = (line*)malloc(sizeof(line));
	s->data.at = 0; s->data.pt = 0; s->data.st = 0; s->data.et = 0; 
	s->next = h; h = s;//head

	while (linelen > 0) {
		f = process();
	}
	sum = sum / (60.0 * vn);
	printf("%.1lf", sum);
	return 0;
}

v1.0

#include <stdio.h>
#include <stdlib.h>
#define START 28800
#define STOP 61200

typedef struct {
	int at; int pt;
	int st; int et;
}customer;
customer wait[10001];
customer line[100];

int cmp_at(const void* a, const void* b) {
	customer* tmpa = (customer*)a;
	customer* tmpb = (customer*)b;
	return tmpa->at - tmpb->at;
}

int cmp_et(const void* a, const void* b) {
	customer* tmpa = (customer*)a;
	customer* tmpb = (customer*)b;
	return tmpb->et - tmpa->et;
}

int main() {
	int n, k, vn, i, tmph, tmpm, tmps, tmpt, tmppt, fast;
	int wf=0, wr=0, linelen=0;
	float sum = 0.0;
	scanf("%d %d", &n, &k);
	for (i = 0; i < n; i++) {
		scanf("%d:%d:%d %d", &tmph, &tmpm, &tmps, &tmppt);
		tmpt = tmps + tmpm * 60 + tmph * 3600;
		if (tmpt > STOP)
			continue;
		wr++;
		wait[wr].at = tmpt; wait[wr].pt = tmppt*60;
	}
	vn = wr;
	if (vn == 0) {
		printf("0.0");
		return 0;
	}
	qsort(&wait[1], vn, sizeof(customer), cmp_at);
	while (linelen < k && wf != wr) {
		line[linelen] = wait[++wf];
		if (line[linelen].at < START)
			line[linelen].st = START;
		else
			line[linelen].st = line[linelen].at;
		line[linelen].et = line[linelen].st + line[linelen].pt;
		linelen++;
	}
	while (linelen > 0) {
		qsort(line, linelen, sizeof(customer), cmp_et);
		fast = line[linelen - 1].et;
		while (line[linelen - 1].et == fast && linelen>0) {
			sum += line[linelen - 1].st - line[linelen - 1].at;
			linelen--; 
		}
		while (linelen < k && wr != wf) {
			line[linelen] = wait[++wf];
			if (line[linelen].at < fast)
				line[linelen].st = fast;
			else
				line[linelen].st = line[linelen].at;
			line[linelen].et = line[linelen].st + line[linelen].pt;
			linelen++;
		}	
	}
	printf("%.1lf", sum / (60.0 * vn));
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章