正答率低いし、相当嫌らしい問題だと思っていたんだけど、解けてみるとそんなこともなかった。が、依然として悪問ではある。問題文が明らかに説明不足。同じ社員に対する入力が複数回与えられることに気づかなかった。
・社員番号に0001等がある可能性があるし、どんな桁の番号が与えられるか分からないからint型で管理するのは適切でない?
→そんなことは無かった。そういう社員番号が与えられるケースは無いらしい。
・一回の入力の販売単価は 1,000,000 円以下で、売上数量は 100,000 個以下ってなってるけど、複数回同じ社員に対して入力があった場合にunsigned long long型ですら溢れる可能性は?
→無かった。ullの表現できる範囲は1,000,000*100,000の184467441倍で、そういうケースが与えられるとは考えにくいし、実際に通った。
まあもし超えるとしても個数で+=単価していくループで、100万超えたところでカウント止めるとかで対処できる。単価1円ケースいっぱいきたら無駄にループ回しまくらにゃならんが。
何も考えずに書いたソース。
#include <iostream> #include <map> #include <vector> using namespace std; int main(){ int n,number; long long a,b; bool flag; map<int,long long> info; vector<int> seq; while(cin >> n && n){ info.clear(); seq.clear(); while(n--){ cin >> number >> a >> b; if(!info[number])seq.push_back(number); // 既出だったら表示順記録配列に入れない。単価0円ケースを考慮してません。 info[number] += a*b; } flag = true; for(int i=0;i<seq.size();i++){ if(info[seq[i]]>=1000000){ flag = false; cout << seq[i] << endl; } } if(flag)cout << "NA" << endl; } }