読者です 読者をやめる 読者になる 読者になる

AOJ 0100 Sale Result

正答率低いし、相当嫌らしい問題だと思っていたんだけど、解けてみるとそんなこともなかった。が、依然として悪問ではある。問題文が明らかに説明不足。同じ社員に対する入力が複数回与えられることに気づかなかった。

404 Not Found

・社員番号に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;
	}
}