PAT (Advanced Level) Practice 1014 Waiting in Line C语言

在这里插入图片描述
又是花了好久的题…还是因为题目看太快和没有想充分就开始(最开始的时候Sorry的s忘记大写…弄得我怀疑人生)。
一开始没有get到他说的17点前开始的业务在17点后完成也依然不会输出sorry,以为17点银行就全部关门了,其实不是。好几个测试点都是考察了在17点后结束的情况。
修改过后最后一个点还是过不去很奇怪,但是根据之前几次类似的经历,修改了一下一个数组的大小就解决了,最后成功通过。
最后润色了一下,开始的时候把小时和分钟分开记录,多用了很多数组和很多行代码,特别冗杂,感觉自己挺傻的,现在改成了统一记录分钟(怪我没想充分就开始),虽然最后代码还是不够简洁,依然有一些重复部分,但应该还是比较易懂的。

#include<stdio.h>

int fastest(int WtimeH[20], int n);
int main(){
	
	int n,m,k,q;
	scanf("%d %d %d %d",&n,&m,&k,&q);
	
	int i,w=0,hh,mm,pp=0,flag=1;					//pp为正在排队的人 
	int Ptime[1000],Wtime[20]={0},time[1000]={0};		//每个人处理时间,窗口时间,每个人结束时间 
	int FWtime[20]={0};			//窗口第一个结束时间 
	int Stime[1000]={0};			//开始时间 
	
	struct{
		int qq[11];
	}queue[20];
	
	int front[20],rear[20];
	
	for(i=0; i<k; i++){
		scanf("%d",&Ptime[i]);
	}
	
	for(pp=0; pp<n*m; pp++){				//先处理前n*m个 
		if(w>=n){
			w=0;flag=0;
		}
		queue[w].qq[rear[w]]=pp;				//记录队列中人的序号 
		rear[w]++;
		Stime[pp]=Wtime[w];
	
		Wtime[w]+=Ptime[pp];
		if(flag){
			FWtime[w]+=Ptime[pp];
		}		
		time[pp]=Wtime[w];
		w++;
	}w=0;
	
	while(pp<k){
		w=fastest(FWtime, n);			//最快的窗口 
		front[w]++;front[w]%=m;
		FWtime[w]+=Ptime[queue[w].qq[front[w]]];
		queue[w].qq[rear[w]]=pp;
		rear[w]++;rear[w]%=m;	
		Stime[pp]=Wtime[w];
		Wtime[w]+=Ptime[pp];
		time[pp]=Wtime[w];
		pp++;
	}
	
	for(i=0; i<q; i++){
		scanf("%d",&pp);
		pp-=1;
		if(Stime[pp]>=540){
			printf("Sorry\n");
		}else{
			printf("%02d:%02d\n",8+(time[pp]/60),time[pp]%60);
		}
	}

	return 0;
}

int fastest(int FWtime[20], int n){
	int i;
	int t=999999;
	int min;
	for(i=0; i<n; i++){
		if(FWtime[i]<t){
			t=FWtime[i];
			min=i;
		}
	}
	return min;
}

### 关于PAT乙级1014题目的解析 #### 题目概述 福尔摩斯的约会题目涉及到日期和时间的转换计算。具体来说,需要将给定的一组特殊编码的时间信息转化为标准格式的时间表示方法[^3]。 #### 解题策略分析 对于此问题的一个有效解决方案是从字符串处理的角度出发。由于输入数据由特定模式构成——即大写字母代表小时部分而小写字母对应分钟部分,并且这些字符还附带了额外的信息用于指示确切数值,因此可以先通过ASCII码来获取字母对应的偏移量从而得知实际所指代的具体时刻值。另外值得注意的是,在某些情况下可能遇到不足两位数的情况,则需补充前导零以满足输出格式的要求。 #### 实现细节说明 为了完成上述逻辑操作,程序首先读取四串长度固定的字符串作为输入参数;接着分别遍历每一对大小写组合并依据其位置关系映射到相应的整型变量之中存储起来形成完整的时分表达形式;最后按照指定样式打印出经过整理后的结果即可。 ```c #include <stdio.h> #include <string.h> // 将单个字符转为对应的数字(基于'A'=0,'a'=0的原则) int char_to_num(char c){ if(c >= 'A' && c <= 'Z') return (c-'A'); else return (c-'a'+26); } void solve(){ char s1[9],s2[9]; scanf("%8s%8s",s1,s2); int hour = 0; for(int i=0;i<4;++i){ hour *= 62; // A-Z,a-z共62种情况 hour += char_to_num(s1[i]); } int minute = 0; for(int i=0;i<4;++i){ minute *= 62; minute += char_to_num(s2[i]); } // 调整天数至合法范围内的小时数 hour %= 24; // 计算天数并调整分钟数 int day = minute / 60; minute %= 60; printf("Day %d Time %02d:%02d\n",day+1,hour,minute); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值