多くの航空会社が優遇会員サービスを提供しています。お客様が一定数のフライトマイルを貯めた場合、そのマイレージを使用して、特典航空券または特典アップグレードを直接利用できます。航空会社の全会員のフライト記録を踏まえ、ID番号に基づいて会員のマイレージポイントを迅速に照会する機能を実現する必要があります。
入力形式:
入力は最初に2つの正の整数N(≤105)とK(≤500)を与えます。その中で、Kは最小走行距離です。つまり、短距離フライトを利用するメンバーの世話をするために、航空会社はKキロメートル未満の範囲のフライトもKキロメートルとして累積します。次のN行、各行は飛行記録を示します。フライトレコードの入力形式は、18桁のID番号(スペース)のフライトマイレージです。ID番号は17桁と最後のチェックコードで構成されています。チェックコードの値の範囲は0〜9、合計11記号です。飛行距離の単位はキロメートルで、(0、15000の範囲内)です。 )整数。次に、正の整数M(≤105)を指定し、次に照会者のM行のID番号を指定します。
出力形式:
クエリ担当者ごとに、現在のマイレージ累積値が表示されます。会員でない場合、情報は出力されません。各クエリ結果は1行を占めます。
4 500
330106199010080419 499
110108198403100012 15000
120104195510156021 800
330106199010080419 1
4
120104195510156021
110108198403100012
330106199010080419
33010619901008041x
800
15000
1000
No Info
質問のアイデア:マップコンテナが思い浮かびました。重要なのは、最後の2つのテストポイントのタイムアウトの問題を解決する方法にあります。後でインターネットを検索したところ、scanfの速度がcinの速度よりも速いことがわかりました。次に、この質問では文字列の長さに18桁が必要です。string.resize(18)の質問が最初に間違っていると、答えは間違っています。
#include<iostream>
#include<map>
#include<string>
using namespace std;
map<string, int> mp;
int main()
{
int n, k, t;
string st;
st.resize(18);
scanf("%d %d", &n, &k);
while (n--)
{
scanf("%s", &st[0]);
scanf("%d", &t);
mp[st] += t < k ? k : t;
}
int m;
scanf("%d", &m);
while (m--)
{
scanf("%s", &st[0]);
if (mp[st] == 0)
printf("No Info\n");
else
printf("%d\n", mp[st]);
}
}