过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;
}
}
}
}