Day 18 算法笔记之算法初步4.1 排序(5)

1. 1080 Graduate Admission

#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <algorithm>
using namespace std;

struct student{
	int id;
	int ge;
	int gi;
	int school[6];
	int sum;
	int rank;
	int flag;
	int final;
}stu[40002];

bool cmp(student a,student b){
	if(a.sum!=b.sum){
		return a.sum>b.sum;		
	}else if(a.ge!=b.ge){
		return a.ge>b.ge;
	}
}

bool cmp1(int a, int b){
	return a<b;
}


int main(){
	
	int n,m,k;
	scanf("%d %d %d",&n,&m,&k);
	
	int school_need[m+2];
	for(int i=0;i<m;i++){
		scanf("%d",&school_need[i]);
	}
	
	for(int i=0;i<n;i++){
		stu[i].id=i;
		scanf("%d %d",&stu[i].ge,&stu[i].gi);
		stu[i].sum=stu[i].ge+stu[i].gi;
		for(int j=0;j<k;j++){
			scanf("%d",&stu[i].school[j]);
		}
	}
	
	sort(stu,stu+n,cmp);
	
	stu[0].rank=1;
	
	for(int i=1;i<n;i++){
		if(stu[i].sum==stu[i-1].sum&&stu[i].ge==stu[i-1].ge){
			stu[i].rank = stu[i-1].rank;
		}else{
			stu[i].rank=i+1;
		}
	}
	
	int get[102][400];
	int num[102];
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			int choose=stu[i].school[j];
			if(school_need[choose]>0){
				get[choose][num[choose]]=stu[i].id;
				num[choose]+=1;
				school_need[choose]-=1;
				stu[i].flag=1;
				stu[i].final=choose;
				break;
		    }
			else{
		    	if(stu[i].rank==stu[i-1].rank&&choose==stu[i-1].final){
			    	get[choose][num[choose]]=stu[i].id;
					num[choose]+=1;
					school_need[choose]-=1;
					stu[i].flag=1;
					stu[i].final=choose;
					break;
				}
			}
		}
	}
	
	for(int i=0;i<m;i++){
		sort(get[i],get[i]+num[i],cmp1);
		for(int j=0;j<num[i];j++){
			printf("%d ",get[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

这一题关于各个学校的录取情况我是用了好几个数组来存,比较散乱,如果用书中的结构体会更好

2.1095 Cars on Campus

这一题把题目看懂之后就对着书上的代码看了,有点疲了。。。

复述一下思路:

首先把数据输入

将数据按车牌号排序,车牌号相同则按时间排序

因为只能一进一出,所以有效数据经过车牌号与时间排序后必然是连在一起的,所以判断一波,如果数据有效,移到另外一个数组中,并且根据这个有效数据算一下最大时间,最大时间放在以车牌号为索引的map结构中

将有效的数据按时间进行排序,获取需要查询的时间,以这个时间为节点,in就加,out就减,就可以得到车辆了,这里因为查询的时间是增长的,所以可以重复使用

最后输入最大时间,最大时间可能有多个,这时候需要用一下map的性质

#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <map>
using namespace std;

int num=0;
map<string,int> parktime;
struct car{
	char plate[10];
	int time;
	char status[4];
}all[10002],valid[10002];

bool cmpbyidandtime(car a, car b){
	if(strcmp(a.plate,b.plate)!=0){
		return strcmp(a.plate,b.plate)<0;
	}else{
		return a.time<b.time;
	}
}

bool cmpbytime(car a, car b){
	return a.time<b.time;
}


int main(){
	
	int n,k;
	scanf("%d %d",&n,&k);
	
	int h,m,s;
	for(int i=0;i<n;i++){
		scanf("%s %d:%d:%d %s",&all[i].plate,&h,&m,&s,&all[i].status);
		all[i].time=h*3600+m*60+s;
	}
	
	sort(all,all+n,cmpbyidandtime);
	
	int max_time=-1;
	
	for(int i=0;i<n-1;i++){
		if(!strcmp(all[i].plate,all[i+1].plate)&&!strcmp(all[i].status,"in")&&!strcmp(all[i+1].status,"out")){
			valid[num++] = all[i];
			valid[num++] = all[i+1];
			
			int intime = all[i+1].time-all[i].time;
			if(parktime.count(all[i].plate)==0){
				parktime[all[i].plate]=0;
			}
			parktime[all[i].plate] +=intime;
			max_time = max(max_time,parktime[all[i].plate]);
		}
	}
	
	sort(valid,valid+num,cmpbytime);
	
	int now=0,numcar=0;
	
	for(int i=0;i<k;i++){
		scanf("%d:%d:%d",&h,&m,&s);
		int time=h*3600+m*60+s;
		
		while(now<num&&valid[now].time<=time){
			if(!strcmp(valid[now].status,"in")){
				numcar++;
			}else{
				numcar--;
			}
			now++;
		}
		printf("%d\n",numcar);
	}
	
	map<string,int>::iterator it;
	
	for(it=parktime.begin();it!=parktime.end();it++){
		if(it->second==max_time){
			printf("%s ",it->first.c_str());
		}
	}
	
	printf("%02d:%02d:%02d\n",max_time/3600,max_time%3600/60,max_time%60);
	

	
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值