草体にぼ日記

だらだらと

CODE FESTIVAL 2017 qual B Problem Set

B - Problem Set

提出AC↓
Submission #8508519 - CODE FESTIVAL 2017 qual B

int main()
{
	cout <<setprecision(10);
	ll n ; cin >> n;
	vector<ll> D(n);
	rep(i,n){
		cin >> D[i];
	}
	SORT(D);
	ll m ; cin >> m;
	vector<ll> T(m);
	rep(i,m) cin >> T[i];
 
	SORT(T);
	ll start = 0 ;
	ll count = 0;
	rep(i,m){
		//難易度がT[i]となるものを探す 二分探索
		ll search = T[i];
		For(j,start,n){
			if(D[j] == search){
				//ok
				start = j+1;
				count ++;
				break;
			}
		}
	}
	if(count==m){
		cout<<"YES"<<endl;
	}else cout << "NO"<<endl;
}

解法
難易度がT[i]となるものを探す 二分探索 これは嘘です
二分探索で探していこうと思ったのですが、それだと同じ必要難易度があったときに、すでにそれを使ったかどうかみたいなのが分からなくなる。
vectorで要素の削除をするのは、配列変数.pop_backで 末尾を消せるらしいですけど途中は消せないので。
嘘ついた
eraseを使えば消せるらしいです
vector::erase - cpprefjp C++日本語リファレンス
計算量⇒削除される要素の数と同じ回数のTのデストラクタが実行される。
何言ってるのか分からないっすね

だから、どちらもソートして難易度の値が小さいものから探していく。
見つかったらその次の難易度のものは、その見つかったものの次の要素番号から探す。
ということで実装してみました。

二分探索を使うのであればeraseが使えるかもしれない
でもmapなり僕の解法のほうが圧倒的に楽だと思う