タイトル説明:
「Isitfull」テイクアウトシステムには、1〜Nの番号が付けられたN個のテイクアウトショップがあります。各テイクアウト店には優先順位があり、最初(時間0)の優先順位は0です。
各時間単位の後、テイクアウトストアに注文がない場合、優先度は1減少し、最低値は0に減少します。テイクアウトストアに注文がある場合、優先度は減少せずに増加し、優先度は注文ごとに2ずつ増加します。
テイクアウトレストランの優先度が特定の時点で5より大きい場合、システムによって優先度キャッシュに追加されます。優先度が3以下の場合、優先度キャッシュからクリアされます。
時間T内のM個の注文情報が与えられた場合、時間Tで優先キャッシュにあるテイクアウトショップの数を計算してください。
入る:
最初の行には、3つの整数N、M、およびTが含まれています。
次のM行の各行には、2つの整数tsとidが含まれています
。これは、時刻tsに番号idを持つテイクアウトストアが注文を受け取ったことを示します。
出力:
答えを表す整数を出力します。
アイデア:
最初のアイデアは、時間1から最大の時間のポイントまでトラバースし、各時点で現在の時間に注文があるかどうかを判断することです。注文がある場合は、優先度が2ずつ上がり、その他は優先度バッファ領域の数が1つ増えると、特定の時間に順序がなく、優先度が4の場合、マイナス1が3以下であることを意味します。このとき、優先バッファ領域は終了します。大丈夫そうですが、見落とされていることが1つあります。それは、複数の店舗から同時に注文がある可能性があるということです。次に、ループの別のレイヤーを追加して、直接タイムアウトします。
私は思考の私の方法を変えたので:
------現在の持ち帰り店が注文を持っているかどうかをマークに配列Fを使用して、店の前の優先順位を追加したかどうかのマークに配列Vを使用して、二次元を開きますiを格納して時間jで取り出す配列ストアに注文があるかどうか、ある時点での注文数は不明なので、ベクトル配列を直接使用します。
------最初に各時点をトラバースし、次に各時点の現在の時点で注文をトラバースします。注文の優先度がある場合は、2を追加すると、配列fは1としてマークされます。これは、現在の時点での順序;
----- 1〜n個のテイクアウェイストアをトラバースします。優先度が0でなく、f配列がマークされていない場合、優先度は1減少します。優先度が5より大きい場合、優先度バッファが追加されていない場合、優先度番号が1増加します。同時に、優先度が3以下で優先度バッファが追加されている場合、配列vは1としてマークされます。優先度番号は1減少し、配列vは0としてマークされます。
コード:
#include <iostream>
using namespace std;
#include <vector>
#include <cstring>
int ans[100005];
int f[100005];//当前店是否有订单
int v[100005];//之前是否加入过优先级
vector<int> a[100005];
int main()
{
int n,m,t,ts,id;
cin>>n>>m>>t;
for(int i=0;i<m;i++)
{
cin>>ts>>id;
a[ts].push_back(id);//ts时刻id号店有订单
}
int cnt=0;
for(int i=1;i<=t;i++)//遍历每个时间点
{
memset(f,0,sizeof(f));
for(int j=0;j<a[i].size();j++)
{
ans[a[i][j]]+=2;
f[a[i][j]]=1;
}
for(int j=1;j<=n;j++)
{
if(f[j]!=1&&ans[j]!=0)
ans[j]--;
if(ans[j]>5&&!v[j])//当前点的优先级大于5且之前没有加入过缓冲
{
cnt++;
v[j]=1;
}
if(ans[j]<=3&&v[j])//当前点的优先级小于等于3且之前加入过缓冲
{
v[j]=0;
cnt--;
}
}
}
cout<<cnt<<endl;
return 0;
}