第十届蓝桥杯 外卖店优先级 Java B组

过90%案例,有个案例显示段错误。应该是用了二维数组的原因,有个数据点太大了爆内存了。可以参考一下思想,有空再看看能不能优化空间。

import java.util.*;
public class Main {
	//案例过90% 有个案例段错误 应该是二维数组占空间太大了
	static Scanner sc=new Scanner(System.in);
	static int N=sc.nextInt();
	static int M=sc.nextInt();
	static int T=sc.nextInt();
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int order[][]=new int[T+1][N+1]; //orders[1][1]:id为1的店在T=1时刻的订单数目
		int ans[]=new int[N+1]; //记录每个店在某个时刻的优先级
		HashSet<Integer> q=new HashSet<>(); //优先缓存 要去重 用hashset
		for(int i=1;i<=M;i++)
		{
			int ts=sc.nextInt(); //t时刻
			int id=sc.nextInt();  //编号
			order[ts][id]++;
		}

		//遍历数组 若在ts时刻 店id里存在订单 则优先级+=订单数*2
		//若不存在订单 则优先级-1
		//当记录到优先级>5时 进入优先缓存 当优先级<=3且在优先队列中 清除出优先缓存
		//因为是寻找某个时刻的优先级 所以T在外层 id编号在内层
		for(int i=1;i<=T;i++)
		{
			for(int j=1;j<=N;j++)
			{
				if(order[i][j]>0)
				{
					ans[j]+=order[i][j]*2;
					
				}
				if(order[i][j]==0&&ans[j]-1>=0)
				{
					ans[j]--;
				}
				if(ans[j]>5) q.add(j);
				if(ans[j]<=3&&q.contains(j)) q.remove(j);
			}
			if(i==T)  
			{
				System.out.println(q.size());
				return;
			}
		}
	}

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值