【PAT-A】1095. Cars on Campus 写题记录

本文深入解析了一种用于停车场管理的高效算法,通过记录车辆进出时间,实现对车辆停留时间的精确计算,找出停留时间最长的车辆,并能快速响应查询时间段内的在场车辆数量。文章详细介绍了算法的实现过程,包括数据结构设计、时间复杂度优化及关键代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题倒数第二个点一直过不去,加上期末考了,也就没有管他。放假重新看代码,一下就看出哪里错了。。

主要思路就是先把所有的信息录入,然后遍历一遍,把符合规则的记录valid值设成true。之后就检查valid==true的记录。

符合规则:in和out先后成对,若有多个In,取离out最近的in。

注意最后的查询时间是增序,只用一次遍历,不然会超时。

#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
struct car{
	char ID[8];
	int ss;
	bool status=false;  //  状态,false为出,true为进 
	bool valid=false;  //  是否是有效记录?
}cars[10005];

struct ltime{  //记录停留最长时间的车的车牌 
	char ID[8];
}lt[10005];

bool cmp(car a,car b){
	return a.ss<b.ss;
}

bool cmp1(ltime a,ltime b){
	int s=strcmp(a.ID,b.ID);
	return s<0;
}
int main(){
	int n,k,t=0;
	scanf("%d %d",&n,&k);
	map<string, int> last_t;  //记录上一个有效车的编号 
	map<string, int> time;  //记录每辆车累计时长 
	int longtime=0;  //记录最长时长 
	int longnum=0;  //记录最长时长的车的数量 
	for (int i=0;i<n;i++){
		char ID[8],status[4];
		int hh,mm,ss;
		scanf("%s",&cars[i].ID);
		scanf("%d:%d:%d %s",&hh,&mm,&ss,&status);
		ss=3600*hh+60*mm+ss;
		cars[i].ss=ss;
		if (strcmp(status,"in")==0) cars[i].status = true;
		else cars[i].status = false;
	}
	sort(cars,cars+n,cmp);  //按照时间顺序排序 
	for (int i=0;i<n;i++){
		if (cars[i].status==true){  //如果是进的车,last_t先设置为它,如果之后还是in,则覆盖?
			last_t[cars[i].ID] = i;
		} else if (cars[i].status ==false){  //如果是出的车 
			if (last_t.find(cars[i].ID) != last_t.end() && cars[last_t[cars[i].ID]].status==true){ //该车存在上次记录,且记录为进, 
				cars[last_t[cars[i].ID]].valid = true; //则该次记录与上次记录都为有效记录 
				cars[i].valid=true;
				time[cars[i].ID]+=cars[i].ss-cars[last_t[cars[i].ID]].ss; //并计算该车停留的累积时长 
				if (time[cars[i].ID] == longtime ){ //如果时长与最长时长一样,则记录其ID,车数加1 
					strcpy(lt[longnum].ID,cars[i].ID);
					longnum++;
				} else if (time[cars[i].ID] > longtime){  //如果比最长时长还长,则从头开始 
					longtime=time[cars[i].ID];  
       //之前这里写cars[i].ss-cars[last_t[cars[i].ID]].ss,倒数第二个测试点过不去,注意区别
					longnum=0;
					strcpy(lt[longnum].ID,cars[i].ID);
					longnum++;
				}
				last_t[cars[i].ID] = i;  //更新last_t 
			}
		}
	}

	int i=0,num=0;
	for (int j=0;j<k;j++){  //输入查询时间 
		int h,m,s;
		scanf("%d:%d:%d",&h,&m,&s);
		s=3600*h+60*m+s;
		for (;i<n;i++){
			if (cars[i].ss>s) break;  //碰到超过查询时间的就跳出 
			if (cars[i].valid == true ) {  //如果未超查询时间,且是有效记录,进车num+1,出车num-1?
				if (cars[i].status == true ){
					num++;
				} else if (cars[i].status == false){
					num--;
				}
			}
		}
		printf("%d\n",num);
	}

	sort (lt,lt+longnum,cmp1);  //按字母表顺序排序 
	for (int i=0;i<longnum;i++){
		printf("%s ",lt[i].ID);
	}
	printf("%02d:%02d:%02d",longtime/3600,longtime%3600/60,longtime%60);
	return 0;
}

 

<think>嗯,我现在遇到了Git推送时出现403权限被拒绝的问题,得想办法解决。首先,我记得错误信息大概是说没有权限,可能是公钥的问题或者认证失败。根据用户提供的引用,有几个可能的原因和解决办法。 先看引用[1]和[2],里面提到的是Permission denied (publickey),这通常和SSH密钥有关。用户可能没有正确配置SSH密钥,或者密钥没有被添加到GitHub账户中。解决方法是检查SSH密钥是否存在,生成新的密钥对,然后添加到GitHub的SSH设置里。另外,引用[4]提到要使用默认的id_rsa文件名,可能用户自己修改了密钥文件名导致Git找不到正确的密钥。 然后是引用[3],用户遇到了403错误,使用的是HTTPS协议,这时候可能认证信息有误,或者远程仓库的URL不正确。可能需要检查远程仓库的URL是否属于自己,或者切换成SSH协议来避免认证问题。另外,缓存的身份凭证可能过期或错误,需要清除或者更新。 现在用户的问题可能有两种情况:使用SSH时的公钥问题,或者使用HTTPS时的认证问题。需要分别排查。比如,先检查使用的协议是SSH还是HTTPS,可以通过git remote -v查看远程仓库的URL。如果是HTTPS的URL,可能会因为账号密码错误或者双因素认证的问题导致403。而如果是SSH的URL,则可能是公钥未正确配置。 如果是SSH的问题,步骤应该是生成SSH密钥,添加到ssh-agent,再添加到GitHub账户。如果密钥已经存在,可能需要启动ssh-agent,或者检查权限是否正确,比如密钥文件的权限是否过于开放(应该设置为600)。 如果是HTTPS的问题,可能需要更新凭据,或者检查远程仓库的URL是否正确,是否有权限访问。例如,如果克隆的是别人的仓库,推送时就会没有权限,需要确认仓库归属。另外,使用个人访问令牌(PAT)替代密码也是一个解决办法,因为GitHub已经不再支持密码认证。 还有可能的情况是,用户同时有多个Git账户,导致密钥冲突,这时候需要配置SSH的config文件来指定不同的密钥。 综上,可能的解决步骤包括:确认协议类型,检查密钥配置,更新远程URL为SSH,清除或更新凭据,使用访问令牌,检查仓库权限等。需要一步步排查,根据错误信息的具体情况选择对应的解决方法。</think>### Git推送出现403权限被拒绝的解决方案 #### **1. 检查远程仓库URL类型(SSH/HTTPS)** 首先确认使用的协议类型: ```bash git remote -v ``` - 若URL以`https://`开头,可能出现认证问题;若以`git@github.com:`开头,则属于SSH协议。 - **HTTPS协议问题**:403错误通常与账号权限或缓存凭据有关。 - **SSH协议问题**:需检查SSH密钥配置。 --- #### **2. 针对HTTPS协议的解决方法** ##### (1) 清除缓存凭据 Git会缓存旧密码或令牌,导致认证失败: ```bash git credential-osxkeychain erase host=github.com protocol=https ``` 或手动删除钥匙串中的GitHub条目(Mac)[^3]。 ##### (2) 使用个人访问令牌(PAT)替代密码 GitHub已禁用密码推送,需生成PAT: 1. 进入GitHub **Settings → Developer settings → Personal access tokens**。 2. 生成新令牌(勾选`repo`权限)。 3. 推送时用令牌代替密码输入。 ##### (3) 检查仓库归属权限 若URL指向他人仓库(如`sweetbao/Machine-Reading...`),需修改为你的仓库地址: ```bash git remote set-url origin https://github.com/你的用户名/仓库名.git ``` --- #### **3. 针对SSH协议的解决方法** ##### (1) 生成并添加SSH密钥 ```bash # 生成新密钥(默认路径和文件名) ssh-keygen -t ed25519 -C "your_email@example.com" # 启动ssh-agent并添加密钥 eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 ``` 将公钥(`~/.ssh/id_ed25519.pub`)粘贴到GitHub **Settings → SSH and GPG keys**[^1][^4]。 ##### (2) 检查SSH连接 ```bash ssh -T git@github.com ``` 若显示`You've successfully authenticated`,则配置成功。 --- #### **4. 其他常见问题** - **密钥权限问题**:确保私钥文件权限为`600`: ```bash chmod 600 ~/.ssh/id_rsa ``` - **多账户冲突**:通过`~/.ssh/config`指定不同仓库的密钥: ``` Host github.com-user1 HostName github.com User git IdentityFile ~/.ssh/user1_key Host github.com-user2 HostName github.com User git IdentityFile ~/.ssh/user2_key ``` 修改仓库URL为对应Host名(如`git@github.com-user1:user1/repo.git`)。 --- #### **总结步骤** 1. 确认URL类型并切换协议(推荐SSH)。 2. 检查密钥配置或生成新密钥。 3. 清除HTTPS缓存凭据或使用PAT。 4. 验证仓库归属权和访问权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值