メモ帳

楽しいアウトプットの場所

ARC105_B問題、C++ set priority_que

priority_queを使った解法

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(ll i=0; i<n; i++)

int main() {
	ll n;
	cin >> n;
	ll min = 1e9;
	priority_queue<int> que;

	rep(i,n){
		ll a;
		cin >> a;
		if(min>a) min = a;
		que.push(a);
	}
	while(!que.empty()){
		ll x = que.top();
		que.pop();
		if(x == min) break;
		ll y = x%min;
		if(y){
			if(min>y) min = y;
			que.push(y);
		}
	}
	cout << min << '\n';
	return 0;
}


setを使った解法は以下の様にになる。

void solve() {

	LL(n);
    ll min = 1e9;
	set<ll> st;

        rep(i,n){
		LL(a);
            chmin(min, a);
	    st.insert(a);
	}
        while(st.size()>0){
            auto itr = st.end();
            itr--;
            ll x = *itr;
            if(x == min) break;
            st.erase(x);
            ll y = x%min;
            if(y){
            chmin(min, y);
            st.insert(y);
        }
    }
    cout << min << '\n';

}
void solve() {

	LL(n);
	set<ll> st;
        rep(i,n){
		LL(a);
	    st.insert(a);
	}
        while(st.size()>0){
            auto itr = st.end(); itr--;
            ll x = *itr;
            if(x == *(st.begin())) break;
            st.erase(x);
            if(x%*(st.begin())) st.insert(x%*(st.begin()));
    }
    cout << *(st.begin()) << '\n';

}